Set up meson build structure for silicon_creator crypto library
Signed-off-by: Jade Philipoom <jadep@google.com>
diff --git a/sw/device/silicon_creator/lib/crypto/ecdsa-p256/meson.build b/sw/device/silicon_creator/lib/crypto/ecdsa-p256/meson.build
new file mode 100644
index 0000000..94406a3
--- /dev/null
+++ b/sw/device/silicon_creator/lib/crypto/ecdsa-p256/meson.build
@@ -0,0 +1,13 @@
+# Copyright lowRISC contributors.
+# Licensed under the Apache License, Version 2.0, see LICENSE for details.
+# SPDX-License-Identifier: Apache-2.0
+
+sw_lib_crypto_otbn_sources += {
+ 'p256': files(
+ 'p256.s'
+ ),
+ 'p256_ecdsa': files(
+ 'p256_ecdsa.s',
+ 'p256.s',
+ ),
+}
diff --git a/sw/device/silicon_creator/lib/crypto/meson.build b/sw/device/silicon_creator/lib/crypto/meson.build
new file mode 100644
index 0000000..e2ffb7c
--- /dev/null
+++ b/sw/device/silicon_creator/lib/crypto/meson.build
@@ -0,0 +1,110 @@
+# Copyright lowRISC contributors.
+# Licensed under the Apache License, Version 2.0, see LICENSE for details.
+# SPDX-License-Identifier: Apache-2.0
+
+# Build definitions for OTBN software
+#
+# OTBN software is built with a separate toolchain, which is called as an
+# external target from Meson. All functionality to call the external toolchain
+# is encapsulated in this build file; users only need to care about two
+# dictionaries.
+#
+# To use an OTBN application in device software, use the sw_lib_crypto_otbn
+# dictionary. For example, to add a dependency to an embeddable version of the
+# barrett384 OTBN application, add the following variable to the list of
+# dependencies: sw_lib_crypto_otbn['barrett384']['rv32embed_dependency']
+#
+# The sw_lib_crypto_otbn dictionary has the following structure:
+# sw_lib_crypto_otbn = {
+# APPNAME: {
+# 'elf': OTBN_ELF_FILE,
+# 'rv32embed_lib': RV32_LIBRARY,
+# 'rv32embed_dependency': DEPENDENCY_ON_RV32_LIBRARY,
+# }}
+#
+# Note that application names must be unique across subdirectories.
+
+# All OTBN software is added to this dictionary and then built in one go.
+sw_lib_crypto_otbn_sources = {}
+
+# All subdirectories add the objects they want to build to the
+# sw_lib_crypto_otbn_sources dictionary.
+subdir('ecdsa-p256')
+
+prog_otbn_build = meson.source_root() / 'util/otbn_build.py'
+
+otbn_build_command = [
+ prog_env,
+ 'OTBN_AS=@0@'.format(prog_otbn_as),
+ 'OTBN_LD=@0@'.format(prog_otbn_ld),
+ 'RV32_TOOL_OBJCOPY=@0@'.format(prog_objcopy.path()),
+ 'RV32_TOOL_AS=@0@'.format(prog_as.path()),
+ 'RV32_TOOL_LD=@0@'.format(prog_ld.path()),
+ prog_python,
+ prog_otbn_build,
+ '--out-dir',
+ '@OUTDIR@',
+ '@INPUT@',
+]
+otbn_build_depend_files = [
+ prog_otbn_as,
+ prog_otbn_ld,
+ prog_objcopy.path(),
+ prog_as.path(),
+ prog_ld.path(),
+ prog_otbn_build,
+]
+
+# Note on variable naming below: Variables in meson are global, we hence prefix
+# all variables with sw_lib_crypto_otbn as "our namespace". Variables which are meant to be
+# local to this file are prefixed with `sw_lib_crypto_otbn__`.
+
+sw_lib_crypto_otbn = {}
+foreach sw_lib_crypto_otbn__app_name, sw_lib_crypto_otbn__app_sources : sw_lib_crypto_otbn_sources
+ # Output files generated by the otbn_build.py script.
+ sw_lib_crypto_otbn__app_output_files = [
+ sw_lib_crypto_otbn__app_name + '.rv32embed.o',
+ sw_lib_crypto_otbn__app_name + '.elf',
+ ]
+
+ # Target calling otbn_build.py
+ sw_lib_crypto_otbn__target = custom_target(
+ 'sw_lib_crypto_otbn_apps_' + sw_lib_crypto_otbn__app_name + '_target',
+ input: sw_lib_crypto_otbn__app_sources,
+ output: sw_lib_crypto_otbn__app_output_files,
+ command: otbn_build_command,
+ depend_files: [otbn_build_depend_files,],
+ )
+
+ # A library containing the OTBN application in a form embeddable into device
+ # (Ibex) software (the *.rv32embed.o file).
+ sw_lib_crypto_otbn__embedded_lib = static_library(
+ sw_lib_crypto_otbn__app_name,
+ [sw_lib_crypto_otbn__target[0]] # == sw_lib_crypto_otbn__app_output_files[0], i.e. *.rv32embed.o
+ )
+
+ # A dependency on the application as embeddable library, to be used if
+ # device (Ibex) software wants to include an OTBN application in its binary.
+ sw_lib_crypto_otbn__dependency = declare_dependency(
+ link_with: sw_lib_crypto_otbn__embedded_lib,
+ )
+
+ sw_lib_crypto_otbn += {
+ sw_lib_crypto_otbn__app_name: {
+ 'elf': sw_lib_crypto_otbn__target[1],
+ 'rv32embed_lib': sw_lib_crypto_otbn__embedded_lib,
+ 'rv32embed_dependency': sw_lib_crypto_otbn__dependency,
+ }
+ }
+
+ custom_target(
+ 'sw_lib_crypto_otbn_app_export_' + sw_lib_crypto_otbn__app_name,
+ command: export_target_command,
+ depend_files: [export_target_depend_files,],
+ input: [sw_lib_crypto_otbn__target[1]],
+ output: 'sw_lib_crypto_otbn_app_export_' + sw_lib_crypto_otbn__app_name,
+ build_always_stale: true,
+ build_by_default: true,
+ )
+
+endforeach
diff --git a/sw/device/silicon_creator/lib/meson.build b/sw/device/silicon_creator/lib/meson.build
index ce82910..f2c3c38 100644
--- a/sw/device/silicon_creator/lib/meson.build
+++ b/sw/device/silicon_creator/lib/meson.build
@@ -3,6 +3,7 @@
# SPDX-License-Identifier: Apache-2.0
subdir('base')
subdir('drivers')
+subdir('crypto')
# Mask ROM fake dependencies. These are temporary dependencies until we
# refactor or copy the other libraries we need (e.g. `runtime`).