Skip to content

Commit

Permalink
feat!: implement libcmt
Browse files Browse the repository at this point in the history
  • Loading branch information
mpolitzer authored and vfusco committed Mar 18, 2024
1 parent 70f483b commit 5cb5c59
Show file tree
Hide file tree
Showing 47 changed files with 7,371 additions and 20 deletions.
1 change: 1 addition & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
machine-emulator-tools-*.ext2
rootfs*
libcmt*
.clang-format
.github
.git
Expand Down
4 changes: 4 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ jobs:
push: false
load: true
build-args: |
CMT_TAR_GZ=${{ env.CMT_TAR_GZ }}
TOOLS_DEB=${{ env.TOOLS_DEB }}
IMAGE_KERNEL_VERSION=${{ env.IMAGE_KERNEL_VERSION }}
LINUX_VERSION=${{ env.LINUX_VERSION }}
Expand Down Expand Up @@ -87,6 +88,7 @@ jobs:
run: |
sha512sum ${{ env.TOOLS_DEB }} > ${{ env.TOOLS_DEB }}.sha512
sha512sum ${{ env.TOOLS_ROOTFS }} > ${{ env.TOOLS_ROOTFS }}.sha512
sha512sum ${{ env.CMT_TAR_GZ }} > ${{ env.CMT_TAR_GZ }}.sha512
- uses: softprops/action-gh-release@v1
if: startsWith(github.ref, 'refs/tags/v')
Expand All @@ -97,6 +99,8 @@ jobs:
${{ env.TOOLS_DEB }}.sha512
${{ env.TOOLS_ROOTFS }}
${{ env.TOOLS_ROOTFS }}.sha512
${{ env.CMT_TAR_GZ }}
${{ env.CMT_TAR_GZ }}.sha512
test-rollup-http-server:
runs-on: ubuntu-22.04
Expand Down
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ control
machine-emulator-tools-*.tar.gz
machine-emulator-tools-*.deb
rootfs.*
libcmt*

# Prerequisites
*.d
Expand Down Expand Up @@ -37,7 +38,7 @@ rootfs.*
*.out
*.app

#Rust
#Rust
*target

#VS Code
Expand Down
29 changes: 28 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ RUN DEBIAN_FRONTEND=noninteractive apt-get update && \
ca-certificates \
git \
wget \
pkg-config \
crossbuild-essential-riscv64 \
gcc-12-riscv64-linux-gnu \
g++-12-riscv64-linux-gnu \
Expand All @@ -42,18 +43,41 @@ RUN DEBIAN_FRONTEND=noninteractive apt-get update && \
mkdir -p ${BUILD_BASE}/tools && chown -R developer:developer ${BUILD_BASE}/tools && \
rm -rf /var/lib/apt/lists/* ${LINUX_HEADERS_FILEPATH}

# Setup latest cross compiler as default
# ------------------------------------------------------------------------------
RUN <<EOF
for tool in cpp g++ gcc gcc-ar gcc-nm gcc-ranlib gcov gcov-dump gcov-tool; do
for version in 12; do
update-alternatives --install \
/usr/bin/riscv64-linux-gnu-$tool riscv64-linux-gnu-$tool \
/usr/bin/riscv64-linux-gnu-$tool-$version $version
done
done
EOF

ENV RISCV_ARCH="rv64gc"
ENV RISCV_ABI="lp64d"
ENV CFLAGS="-march=$RISCV_ARCH -mabi=$RISCV_ABI"
ENV TOOLCHAIN_PREFIX="riscv64-linux-gnu-"
ENV TOOLCHAIN_SUFFIX="-12"

FROM tools-env as builder
COPY --chown=developer:developer sys-utils/ ${BUILD_BASE}/tools/sys-utils/

# build C/C++ tools
# ------------------------------------------------------------------------------
FROM builder as c-builder
ARG CMT_BASE=${BUILD_BASE}/tools/sys-utils/libcmt
ARG CMT_TAR_GZ=libcmt-v0.14.1-dev.tar.gz
ARG BUILD_BASE=/opt/cartesi

USER developer
RUN make -C ${CMT_BASE} -j$(nproc) ioctl.build mock.build
USER root
RUN make -C ${CMT_BASE} -j$(nproc) ioctl.install \
TARGET_PREFIX=${CMT_BASE}/install && \
tar czf ${BUILD_BASE}/${CMT_TAR_GZ} -C ${CMT_BASE}/install .
RUN make -C ${BUILD_BASE}/tools/sys-utils/libcmt/ -j$(nproc) ioctl.install mock.install \
PREFIX=/usr/x86_64-linux-gnu TARGET_PREFIX=/usr/riscv64-linux-gnu
USER developer
RUN make -C ${BUILD_BASE}/tools/sys-utils/ -j$(nproc) all

Expand Down Expand Up @@ -117,6 +141,7 @@ ARG STAGING_BASE=${BUILD_BASE}/_install
ARG STAGING_DEBIAN=${STAGING_BASE}/DEBIAN
ARG STAGING_SBIN=${STAGING_BASE}/usr/sbin
ARG STAGING_BIN=${STAGING_BASE}/usr/bin
ARG CMT_TAR_GZ=libcmt-v0.14.1-dev.tar.gz

RUN mkdir -p ${STAGING_DEBIAN} ${STAGING_SBIN} ${STAGING_BIN} ${STAGING_BASE}/etc && \
echo "cartesi-machine" > ${staging_base}/etc/hostname
Expand All @@ -128,9 +153,11 @@ COPY --from=c-builder ${BUILD_BASE}/tools/sys-utils/xhalt/xhalt ${STAGING_SBIN}
COPY --from=c-builder ${BUILD_BASE}/tools/sys-utils/yield/yield ${STAGING_SBIN}
COPY --from=c-builder ${BUILD_BASE}/tools/sys-utils/rollup/rollup ${STAGING_SBIN}
COPY --from=c-builder ${BUILD_BASE}/tools/sys-utils/ioctl-echo-loop/ioctl-echo-loop ${STAGING_BIN}
COPY --from=c-builder ${BUILD_BASE}/tools/sys-utils/yield/yield ${STAGING_SBIN}
COPY --from=c-builder ${BUILD_BASE}/tools/sys-utils/misc/* ${STAGING_BIN}
COPY --from=rust-builder ${BUILD_BASE}/tools/rollup-http/rollup-init/rollup-init ${STAGING_SBIN}
COPY --from=http-server-builder ${BUILD_BASE}/tools/rollup-http/rollup-http-server/target/riscv64gc-unknown-linux-gnu/release/rollup-http-server ${STAGING_BIN}
COPY --from=echo-dapp-builder ${BUILD_BASE}/tools/rollup-http/echo-dapp/target/riscv64gc-unknown-linux-gnu/release/echo-dapp ${STAGING_BIN}

RUN dpkg-deb -Zxz --root-owner-group --build ${STAGING_BASE} ${BUILD_BASE}/${TOOLS_DEB}
COPY --from=c-builder ${BUILD_BASE}/${CMT_TAR_GZ} ${BUILD_BASE}/${CMT_TAR_GZ}
4 changes: 4 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ VERSION := $(MAJOR).$(MINOR).$(PATCH)$(LABEL)
TOOLS_DEB := machine-emulator-tools-v$(VERSION).deb
TOOLS_IMAGE := cartesi/machine-emulator-tools:$(VERSION)
TOOLS_ROOTFS := rootfs-tools-v$(VERSION).ext2
CMT_TAR_GZ := libcmt-$(VERSION).tar.gz

IMAGE_KERNEL_VERSION ?= v0.19.1
LINUX_VERSION ?= 6.5.9-ctsi-1
Expand All @@ -33,6 +34,7 @@ all: fs
build: control
@docker buildx build --load \
--build-arg TOOLS_DEB=$(TOOLS_DEB) \
--build-arg CMT_TAR_GZ=$(CMT_TAR_GZ) \
--build-arg IMAGE_KERNEL_VERSION=$(IMAGE_KERNEL_VERSION) \
--build-arg LINUX_VERSION=$(LINUX_VERSION) \
--build-arg LINUX_HEADERS_URLPATH=$(LINUX_HEADERS_URLPATH) \
Expand All @@ -44,6 +46,7 @@ build: control
copy:
@ID=`docker create $(TOOLS_IMAGE)` && \
docker cp $$ID:/opt/cartesi/$(TOOLS_DEB) . && \
docker cp $$ID:/opt/cartesi/$(CMT_TAR_GZ) . && \
docker rm $$ID

$(TOOLS_DEB) deb: build
Expand All @@ -63,6 +66,7 @@ $(TOOLS_ROOTFS) fs: $(TOOLS_DEB)
rm -f rootfs.gnutar rootfs.tar

env:
@echo CMT_TAR_GZ=$(CMT_TAR_GZ)
@echo TOOLS_DEB=$(TOOLS_DEB)
@echo TOOLS_ROOTFS=$(TOOLS_ROOTFS)
@echo TOOLS_IMAGE=$(TOOLS_IMAGE)
Expand Down
2 changes: 1 addition & 1 deletion fs/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ RUN mkdir benchmarks && cd benchmarks && \

# Final image
FROM --platform=linux/riscv64 riscv64/ubuntu:22.04
ARG TOOLS_DEB=machine-emulator-tools-v0.14.0.deb
ARG TOOLS_DEB=machine-emulator-tools-v0.14.1-dev.deb
ADD ${TOOLS_DEB} /tmp/
RUN apt-get update && \
apt-get install -y --no-install-recommends \
Expand Down
4 changes: 2 additions & 2 deletions sys-utils/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ all: $(UTILITIES)
$(UTILITIES):
@$(MAKE) -C $@

with-toolchain:
@$(MAKE) $(UTILITIES_WITH_TOOLCHAIN)
with-toolchain:
@$(MAKE) $(UTILITIES_WITH_TOOLCHAIN)

$(UTILITIES_WITH_TOOLCHAIN):
@$(MAKE) -C $@ with-toolchain
Expand Down
9 changes: 4 additions & 5 deletions sys-utils/ioctl-echo-loop/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,11 @@ RISCV_ARCH ?= rv64gc
RISCV_ABI ?= lp64d

TOOLCHAIN_PREFIX ?= riscv64-cartesi-linux-gnu-
TOOLCHAIN_SUFFIX ?=

RVCC = $(TOOLCHAIN_PREFIX)gcc$(TOOLCHAIN_SUFFIX)
RVCXX = $(TOOLCHAIN_PREFIX)g++$(TOOLCHAIN_SUFFIX)
RVCOPY = $(TOOLCHAIN_PREFIX)objcopy$(TOOLCHAIN_SUFFIX)
RVDUMP = $(TOOLCHAIN_PREFIX)objdump$(TOOLCHAIN_SUFFIX)
RVCC = $(TOOLCHAIN_PREFIX)gcc
RVCXX = $(TOOLCHAIN_PREFIX)g++
RVCOPY = $(TOOLCHAIN_PREFIX)objcopy
RVDUMP = $(TOOLCHAIN_PREFIX)objdump
STRIP = $(TOOLCHAIN_PREFIX)strip
CFLAGS :=-Wall -pedantic -O2 -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI)

Expand Down
197 changes: 197 additions & 0 deletions sys-utils/libcmt/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
# paths
PREFIX = /usr
TARGET_PREFIX ?= $(PREFIX)

TOOLCHAIN_PREFIX ?= riscv64-linux-gnu-
TARGET_CC := $(TOOLCHAIN_PREFIX)gcc
TARGET_AR := $(TOOLCHAIN_PREFIX)ar
TARGET_CFLAGS := -Wvla -O2 -g -Wall -pedantic -Wextra -Iinclude
CFLAGS := -Wvla -O2 -g -Wall -pedantic -Wextra -Iinclude

ALL := ioctl.build mock.build tools.build doc.build test.run
all: $(ALL)

#-------------------------------------------------------------------------------
examples_SRC := \
doc/examples/abi_encode_000.c \
doc/examples/abi_encode_001.c \
doc/examples/abi_encode_002.c \
doc/examples/abi_decode_000.c \
doc/examples/abi_decode_001.c \
doc/examples/abi_decode_002.c \
doc/examples/io.c \
doc/examples/rollup.c

examples_OBJDIR := .build/examples/
examples_OBJ := $(patsubst %.c,$(examples_OBJDIR)%.o,$(examples_SRC))

$(examples_OBJ): $(examples_OBJDIR)%.o: %.c
@mkdir -p $(@D)
$(CC) $(CFLAGS) -MT $@ -MMD -MP -MF $(@:.o=.d) -c -o $@ $<

# no need to link, just ensure examples build correctly
examples.build: $(examples_OBJ)

#-------------------------------------------------------------------------------
ioctl_SRC := \
src/buf.c \
src/abi.c \
src/keccak.c \
src/merkle.c \
src/merkle-table.c \
src/rollup.c \
src/ioctl/io.c

ioctl_OBJDIR := build/ioctl/
ioctl_OBJ := $(patsubst %.c,$(ioctl_OBJDIR)%.o,$(ioctl_SRC))
ioctl_LIB := $(ioctl_OBJDIR)libcmt.a

$(ioctl_OBJ): $(ioctl_OBJDIR)%.o: %.c
@mkdir -p $(@D)
$(TARGET_CC) $(TARGET_CFLAGS) -MT $@ -MMD -MP -MF $(@:.o=.d) -c -o $@ $<

$(ioctl_LIB): $(ioctl_OBJ)
$(TARGET_AR) rcs $@ $^

$(ioctl_OBJDIR)io_echo: src/tests/io_echo.c $(ioctl_LIB)
$(TARGET_CC) $(TARGET_CFLAGS) -o $@ $^

$(ioctl_OBJDIR)rollup_echo: src/tests/rollup_echo.c $(ioctl_LIB)
$(TARGET_CC) $(TARGET_CFLAGS) -o $@ $^

ioctl.build: $(ioctl_LIB) $(ioctl_OBJDIR)io_echo $(ioctl_OBJDIR)rollup_echo
ioctl.install: $(ioctl_LIB)
mkdir -p $(TARGET_DESTDIR)$(TARGET_PREFIX)/lib
cp -f $< $(TARGET_DESTDIR)$(TARGET_PREFIX)/lib
mkdir -p $(TARGET_DESTDIR)$(TARGET_PREFIX)/include/libcmt/
cp -f include/libcmt/*.h $(TARGET_DESTDIR)$(TARGET_PREFIX)/include/libcmt/
mkdir -p $(TARGET_DESTDIR)$(TARGET_PREFIX)/lib/pkgconfig
sed \
-e 's|@ARG_PREFIX@|$(TARGET_PREFIX)|g' \
tools/templates/libcmt.pc > $(TARGET_DESTDIR)$(TARGET_PREFIX)/lib/pkgconfig/libcmt.pc

#-------------------------------------------------------------------------------
mock_SRC := \
src/abi.c \
src/buf.c \
src/keccak.c \
src/merkle.c \
src/merkle-table.c \
src/rollup.c \
src/mock/io.c

mock_OBJDIR := build/mock/
mock_OBJ := $(patsubst %.c,$(mock_OBJDIR)%.o,$(mock_SRC))
mock_LIB := $(mock_OBJDIR)libcmt.a

$(mock_OBJ): $(mock_OBJDIR)%.o: %.c
@mkdir -p $(@D)
$(CC) $(CFLAGS) -MT $@ -MMD -MP -MF $(@:.o=.d) -c -o $@ $<

$(mock_LIB): $(mock_OBJ)
$(AR) rcs $@ $^

$(mock_OBJDIR)io_echo: src/tests/io_echo.c $(mock_LIB)
$(CC) $(CFLAGS) -o $@ $^

$(mock_OBJDIR)rollup_echo: src/tests/rollup_echo.c $(mock_LIB)
$(CC) $(CFLAGS) -o $@ $^

mock.build: $(mock_LIB) $(mock_OBJDIR)io_echo $(mock_OBJDIR)rollup_echo

mock.install: $(mock_LIB)
mkdir -p $(DESTDIR)$(PREFIX)/lib
cp -f $< $(DESTDIR)$(PREFIX)/lib
mkdir -p $(DESTDIR)$(PREFIX)/include/libcmt/mock
cp -f include/libcmt/*.h $(DESTDIR)$(PREFIX)/include/libcmt/
mkdir -p $(DESTDIR)$(PREFIX)/lib/pkgconfig
sed \
-e 's|@ARG_PREFIX@|$(PREFIX)|g' \
tools/templates/libcmt_mock.pc > $(DESTDIR)$(PREFIX)/lib/pkgconfig/libcmt.pc

#-------------------------------------------------------------------------------
testdata:
cast calldata "EvmAdvance(address,uint256,uint256,uint256,bytes)" \
`cast address-zero` 1 2 3 0xdeadbeef | xxd -r -p > dat/C.bin
cast calldata "Voucher(address,bytes)" \
`cast address-zero` 0xdeadbeef | xxd -r -p > dat/C.v0.bin
cast calldata "Notice(bytes)" \
0xdeadbeef | xxd -r -p > dat/C.n0.bin
xxd -n advance -i dat/C.bin > dat/C.h
xxd -n voucher -i dat/C.v0.bin > dat/C.v0.h
xxd -n notice -i dat/C.n0.bin > dat/C.n0.h

unittests_BINS := \
$(mock_OBJDIR)abi-multi \
$(mock_OBJDIR)abi-single \
$(mock_OBJDIR)keccak \
$(mock_OBJDIR)merkle \

$(mock_OBJDIR)abi-multi: src/tests/abi-multi.c $(mock_LIB)
$(CC) $(CFLAGS) -o $@ $^

$(mock_OBJDIR)abi-single: src/tests/abi-single.c $(mock_LIB)
$(CC) $(CFLAGS) -o $@ $^

$(mock_OBJDIR)keccak: src/tests/keccak.c $(mock_LIB)
$(CC) $(CFLAGS) -o $@ $^

$(mock_OBJDIR)merkle: src/tests/merkle.c $(mock_LIB)
$(CC) $(CFLAGS) -o $@ $^

test.build: $(unittests_BINS) $(mock_OBJDIR)io_echo
test.run: test.build
$(foreach test,$(unittests_BINS),$(test) &&) true

#-------------------------------------------------------------------------------
tools_OBJDIR := build/tools/

tools_BINS := \
$(tools_OBJDIR)funsel \
$(tools_OBJDIR)merkle-table

$(tools_OBJDIR)funsel: src/tools/funsel.c $(mock_LIB)
@mkdir -p $(@D)
$(CC) $(CFLAGS) -o $@ $^

$(tools_OBJDIR)merkle-table: src/tools/merkle-table.c src/keccak.c
@mkdir -p $(@D)
$(CC) $(CFLAGS) -o $@ $^

# generated source code
src/merkle.c: src/merkle-table.c
src/merkle-table.c: $(tools_OBJDIR)merkle-table
$< > $@

tools.build: $(tools_BINS)

#-------------------------------------------------------------------------------

help:
@echo "Targets: (default: '*')"
@echo "* all - $(ALL)"
@echo " mock.build - Build a mocked version of the library, tools and examples; to run on the host system."
@echo " mock.install - Install the mocked version of the library and C headers; on the host system."
@echo " Use DESTDIR and PREFIX to customize the installation."
@echo " ioctl.build - Build the library, tools and examples; to run on the cartesi-machine."
@echo " (requires the cartesi Linux headers to build)"
@echo " ioctl.install - Install the library and C headers; on the host system."
@echo " Use TARGET_DESTDIR and TARGET_PREFIX to customize the installation."
@echo " test.build - Build tests on top of the mocked library to run on the host system."
@echo " test.run - Execute the tests."
@echo " tools.build - Build tools on top of the mocked library to run on the host system."
@echo " doc.build - Build the documentation and API references as html."
@echo " clean - remove the binaries and objects."

doc/theme:
git clone [email protected]:jothepro/doxygen-awesome-css.git $@
git -C doc/theme checkout 8cea9a073ecd50a5b2c0958a3df100292d6c7374

doc.build: doc/theme examples.build
doxygen doc/Doxyfile

OBJ := $(mock_OBJ) $(ioctl_OBJ) $(examples_OBJ) $(tools_OBJ)
clean:
rm -rf $(OBJ) $(unittests_BINS) $(tools_BINS) libcmt_mock.a libcmt.a

-include $(OBJ:%.o=%.d)
Loading

0 comments on commit 5cb5c59

Please sign in to comment.