| # |
| # Copyright 2021 Google LLC |
| # |
| # This program is free software; you can redistribute it and/or |
| # modify it under the terms of the GNU General Public License |
| # version 2 as published by the Free Software Foundation. |
| # |
| # 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. |
| # |
| |
| # Check for EAPI 5+ |
| case "${EAPI:-0}" in |
| 0|1|2|3|4) die "Unsupported EAPI=${EAPI:-0} (too old) for ${ECLASS}" ;; |
| 5|6) inherit eapi7-ver ;; |
| 7) ;; |
| esac |
| |
| inherit linux-info linux-mod toolchain-funcs |
| |
| IUSE=" |
| +clang |
| +llvm_ias |
| module_sign |
| platform-key |
| " |
| |
| REQUIRED_USE=" |
| llvm_ias? ( clang ) |
| " |
| |
| DEPEND=" |
| platform-key? ( sys-boot/platform-key ) |
| virtual/linux-sources |
| " |
| |
| # Because our kernel version string ends with '+' (e.g. |
| # "4.4.21+"), Gentoo Linux's linux-info.eclass cannot locate the kernel build |
| # output directory. Hence we set it up here. |
| KBUILD_OUTPUT="${KERNEL_DIR}"/build |
| |
| cos-linux-mod_src_prepare() { |
| # Allowing gcc to be used when clang is not set. |
| # This is copied from cros-kernel2.eclass to make sure the third |
| # party kernel module uses the same compiler as kernel. |
| use clang || cros_use_gcc |
| |
| default |
| } |
| |
| cos-linux-mod_src_compile() { |
| BUILD_PARAMS="${BUILD_PARAMS} CC=${CC} LD=${LD}" |
| # Assemble with LLVM's integrated assembler on x86_64 and aarch64 |
| if use llvm_ias; then |
| export LLVM_IAS=1 |
| fi |
| linux-mod_src_compile |
| } |
| |
| cos-linux-mod_src_install() { |
| local key_path="${KBUILD_OUTPUT}"/certs |
| if use platform-key ; then |
| key_path="${ROOT}"/build/share/platform-key |
| fi |
| if use module_sign ; then |
| for i in ${MODULE_NAMES} |
| do |
| unset libdir srcdir objdir |
| for n in $(find_module_params ${i}) |
| do |
| eval ${n/:*}=${n/*:/} |
| done |
| libdir=${libdir:-misc} |
| srcdir=${srcdir:-${S}} |
| objdir=${objdir:-${srcdir}} |
| |
| einfo "Signing ${modulename} module" |
| cos-linux-mod_sign "${objdir}/${modulename}.${KV_OBJ}" "${key_path}" |
| # Do not strip signature |
| dostrip -x "/lib/modules/${KV_FULL}/${libdir}/${modulename}.${KV_OBJ}" |
| done |
| fi |
| |
| linux-mod_src_install |
| } |
| |
| cos-linux-mod_sign() { |
| local module_file="$1" |
| local key_path="$2" |
| "${KBUILD_OUTPUT}"/scripts/sign-file \ |
| sha256 \ |
| "${key_path}"/signing_key.pem \ |
| "${key_path}"/signing_key.x509 \ |
| "${module_file}" || die "failed to sign a module" |
| } |
| |
| cos-linux-mod_sign_detached() { |
| local module_file="$1" |
| local key_path="$2" |
| "${KBUILD_OUTPUT}"/scripts/sign-file \ |
| -p \ |
| sha256 \ |
| "${key_path}"/signing_key.pem \ |
| "${key_path}"/signing_key.x509 \ |
| "${module_file}" || die "failed to sign a module" |
| } |