From 9d025ba4ea9a8c5e6e295f79d1f319fd55db2e30 Mon Sep 17 00:00:00 2001 From: Victor Fusco <1221933+vfusco@users.noreply.github.com> Date: Tue, 10 Oct 2023 09:32:39 -0300 Subject: [PATCH] feat!: Bump emulator and grpc-interfaces - Add --version option and bump the version for the next release. - Update boost to version 1.81 --- .github/workflows/build.yml | 45 +++----- .gitmodules | 3 - CHANGELOG.md | 9 ++ Dockerfile | 10 +- Makefile | 6 +- README.md | 4 +- lib/grpc-interfaces | 2 +- lib/machine-emulator-defines | 1 - src/Makefile | 6 +- src/create-machines.lua | 218 ++++++++++++++++++----------------- src/htif-defines.h | 55 +++++++++ src/server-manager.cpp | 51 ++++---- src/test-server-manager.cpp | 27 +---- 13 files changed, 237 insertions(+), 200 deletions(-) delete mode 160000 lib/machine-emulator-defines create mode 100644 src/htif-defines.h diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e870646..7c9ebc0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,11 +2,10 @@ name: Build/Test/Release on: [push] env: EMULATOR_REPOSITORY: cartesi/machine-emulator - EMULATOR_TAG: 0.15.2 - ROM_VERSION: v0.17.0 - KERNEL_VERSION: v0.17.0 - LINUX_VERSION: 5.15.63-ctsi-2-v0.17.0 - ROOTFS_VERSION: v0.18.0 + EMULATOR_TAG: 0.16.0-test2 + KERNEL_VERSION: v0.19.1 + LINUX_VERSION: 6.5.9-ctsi-1-v0.19.1 + TOOLS_VERSION: v0.14.0-test1 CARTESI_IMAGES_PATH: /usr/share/cartesi-machine/images HOST_IMAGES_PATH: /tmp/cartesi-machine-images/ permissions: @@ -130,9 +129,9 @@ jobs: - name: Download [rootfs.ext2] uses: Legion2/download-release-action@v2.1.0 with: - repository: ${{ github.repository_owner }}/image-rootfs - tag: ${{ env.ROOTFS_VERSION }} - file: rootfs-${{ env.ROOTFS_VERSION }}.ext2 + repository: ${{ github.repository_owner }}/machine-emulator-tools + tag: ${{ env.TOOLS_VERSION }} + file: rootfs-tools-${{ env.TOOLS_VERSION }}.ext2 - name: Download [kernel.bin] uses: Legion2/download-release-action@v2.1.0 @@ -141,20 +140,12 @@ jobs: tag: ${{ env.KERNEL_VERSION }} file: linux-${{ env.LINUX_VERSION }}.bin - - name: Download [rom.bin] - uses: Legion2/download-release-action@v2.1.0 - with: - repository: ${{ github.repository_owner }}/machine-emulator-rom - tag: ${{ env.ROM_VERSION }} - file: rom-${{ env.ROM_VERSION }}.bin - - name: Move images to cartesi images folder run: | mkdir -m 755 -p /tmp/cartesi-machine-images - mv rom-*.bin linux-*.bin rootfs-*.ext2 ${{ env.HOST_IMAGES_PATH }} + mv linux-*.bin rootfs-*.ext2 ${{ env.HOST_IMAGES_PATH }} cd ${{ env.HOST_IMAGES_PATH }} && ln -s linux-${{ env.LINUX_VERSION }}.bin linux.bin - cd ${{ env.HOST_IMAGES_PATH }} && ln -s rom-${{ env.ROM_VERSION }}.bin rom.bin - cd ${{ env.HOST_IMAGES_PATH }} && ln -s rootfs-${{ env.ROOTFS_VERSION }}.ext2 rootfs.ext2 + cd ${{ env.HOST_IMAGES_PATH }} && ln -s rootfs-tools-${{ env.TOOLS_VERSION }}.ext2 rootfs.ext2 - name: Run test suite inside the docker image (Linux/${{ matrix.arch }}) run: | @@ -241,9 +232,9 @@ jobs: - name: Download [rootfs.ext2] uses: Legion2/download-release-action@v2.1.0 with: - repository: ${{ github.repository_owner }}/image-rootfs - tag: ${{ env.ROOTFS_VERSION }} - file: rootfs-${{ env.ROOTFS_VERSION }}.ext2 + repository: ${{ github.repository_owner }}/machine-emulator-tools + tag: ${{ env.TOOLS_VERSION }} + file: rootfs-tools-${{ env.TOOLS_VERSION }}.ext2 - name: Download [kernel.bin] uses: Legion2/download-release-action@v2.1.0 @@ -252,20 +243,12 @@ jobs: tag: ${{ env.KERNEL_VERSION }} file: linux-${{ env.LINUX_VERSION }}.bin - - name: Download [rom.bin] - uses: Legion2/download-release-action@v2.1.0 - with: - repository: ${{ github.repository_owner }}/machine-emulator-rom - tag: ${{ env.ROM_VERSION }} - file: rom-${{ env.ROM_VERSION }}.bin - - name: Move images to cartesi images folder run: | mkdir -m 755 -p /tmp/cartesi-machine-images - mv rom-*.bin linux-*.bin rootfs-*.ext2 ${{ env.HOST_IMAGES_PATH }} + mv linux-*.bin rootfs-*.ext2 ${{ env.HOST_IMAGES_PATH }} cd ${{ env.HOST_IMAGES_PATH }} && ln -s linux-${{ env.LINUX_VERSION }}.bin linux.bin - cd ${{ env.HOST_IMAGES_PATH }} && ln -s rom-${{ env.ROM_VERSION }}.bin rom.bin - cd ${{ env.HOST_IMAGES_PATH }} && ln -s rootfs-${{ env.ROOTFS_VERSION }}.ext2 rootfs.ext2 + cd ${{ env.HOST_IMAGES_PATH }} && ln -s rootfs-tools-${{ env.TOOLS_VERSION }}.ext2 rootfs.ext2 - name: Run test suite inside the docker image (Linux/${{ matrix.arch }}) run: | diff --git a/.gitmodules b/.gitmodules index 008c6be..6d6d78f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ [submodule "lib/grpc-interfaces"] path = lib/grpc-interfaces url = ../grpc-interfaces.git -[submodule "lib/machine-emulator-defines"] - path = lib/machine-emulator-defines - url = ../machine-emulator-defines.git diff --git a/CHANGELOG.md b/CHANGELOG.md index 881fb92..75a6301 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed +- Updated libboost version to 1.81 +- Updated grpc-interfaces +- Updated machine-emulator-defines +- Bumped version to 0.9.0 + +### Added +- Added \-\-version command line option + ## [0.8.2] - 2023-08-21 ### Changed - Updated server-manager version to v0.8.2 diff --git a/Dockerfile b/Dockerfile index b8bcacd..3d15d8f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,8 +9,8 @@ USER root RUN apt-get update && \ DEBIAN_FRONTEND="noninteractive" apt-get install --no-install-recommends -y \ build-essential wget git \ - libreadline-dev libboost-coroutine-dev libboost-context-dev \ - libboost-filesystem-dev libboost-log-dev libssl-dev libc-ares-dev zlib1g-dev \ + libreadline-dev libboost-coroutine1.81-dev libboost-context1.81-dev \ + libboost-filesystem1.81-dev libboost-log1.81-dev libssl-dev libc-ares-dev zlib1g-dev \ ca-certificates automake libtool patchelf cmake pkg-config lua5.4 liblua5.4-dev \ libgrpc++-dev libprotobuf-dev protobuf-compiler-grpc \ libcrypto++-dev clang-tidy-15 clang-format-15 && \ @@ -36,7 +36,11 @@ FROM --platform=$TARGETPLATFORM ${EMULATOR_REPOSITORY}:${EMULATOR_TAG} USER root RUN apt-get update && DEBIAN_FRONTEND="noninteractive" apt-get install -y \ - libboost-log1.74.0 \ + libboost-coroutine1.81.0 \ + libboost-context1.81.0 \ + libboost-filesystem1.81.0 \ + libboost-log1.81.0 \ + libcrypto++8 \ && rm -rf /var/lib/apt/lists/* COPY --from=installer /usr/bin/server-manager /usr/bin/server-manager diff --git a/Makefile b/Makefile index 06dbd42..7d051a7 100644 --- a/Makefile +++ b/Makefile @@ -37,8 +37,8 @@ HEALTHCHECK_PROTO := third-party/health.proto # Docker image settings TAG ?= devel -EMULATOR_TAG ?= 0.15.2 -EMULATOR_REPOSITORY ?= cartesi/machine-emulator +EMULATOR_TAG ?= main +EMULATOR_REPOSITORY ?= ghcr.io/cartesi/machine-emulator # Mac OS X specific settings ifeq ($(UNAME),Darwin) @@ -109,7 +109,7 @@ $(SERVER_MANAGER_PROTO): @exit 1 test server-manager: | $(SERVER_MANAGER_PROTO) $(HEALTHCHECK_PROTO) -test lint coverage-report check-format format server-manager create-machines create-and-test clean-machines run-test-server-manager: +test lint coverage-report check-format format server-manager create-machines create-and-test clean-machines clean-test-processes run-test-server-manager: @eval $$($(MAKE) -s --no-print-directory env); $(MAKE) -C $(SRCDIR) $@ source-default: | $(SERVER_MANAGER_PROTO) checksum diff --git a/README.md b/README.md index f3d9ce8..f239af4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Cartesi Server-Manager -The Cartesi Server-Manager is a microservice that serves as an interface between the Remote Cartesi Machine (RCM) and other components of the Cartesi Rollup node. It is designed to simplify the communication between the RCM and the rest of the Cartesi node. It's written in C/C++ with POSIX dependencies restricted to the terminal and process facilites. Currently, it is distributed as a docker image. +The Cartesi Server-Manager is a microservice that serves as an interface between the Remote Cartesi Machine (RCM) and other components of the Cartesi Rollup node. It is designed to simplify the communication between the RCM and the rest of the Cartesi node. It's written in C/C++ with POSIX dependencies restricted to the terminal and process facilities. Currently, it is distributed as a docker image. ## Getting Started @@ -29,7 +29,7 @@ Cleaning targets: - GNU Make >= 3.81 - GRPC 1.50.0 - Lua 5.4.x -- Boost >= 1.71 +- Boost >= 1.81 Obs: Please note that Apple Clang Version number does not follow upstream LLVM/Clang. diff --git a/lib/grpc-interfaces b/lib/grpc-interfaces index cba7c3f..a92e043 160000 --- a/lib/grpc-interfaces +++ b/lib/grpc-interfaces @@ -1 +1 @@ -Subproject commit cba7c3f1c53b83bee83d8a1e5a1074591279220f +Subproject commit a92e0436a644f8990ed1830bcfd33caed2deb63e diff --git a/lib/machine-emulator-defines b/lib/machine-emulator-defines deleted file mode 160000 index 4f164a7..0000000 --- a/lib/machine-emulator-defines +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 4f164a788ff34b43c6c070fdc14204cd69110440 diff --git a/src/Makefile b/src/Makefile index cfe55e9..951e5ad 100644 --- a/src/Makefile +++ b/src/Makefile @@ -56,8 +56,8 @@ BOOST_INC_Darwin=-I/usr/local/opt/boost/include CRYPTOPP_LIB_Darwin:=-L/usr/local/opt/cryptopp/lib -lcryptopp CRYPTOPP_INC_Darwin:=-I/usr/local/opt/cryptopp/include else # Macports installation -BOOST_LIB_DIR_Darwin=-L/opt/local/lib -BOOST_INC_Darwin=-I/opt/local/include +BOOST_LIB_DIR_Darwin=-L/opt/local/libexec/boost/1.81/lib +BOOST_INC_Darwin=-I/opt/local/libexec/boost/1.81/include CRYPTOPP_LIB_Darwin:=-L/opt/local/lib -lcryptopp CRYPTOPP_INC_Darwin:=-I/opt/local/include endif @@ -107,7 +107,7 @@ GRPC_INC=$(GRPC_INC_$(UNAME)) PROTOBUF_LIB=$(PROTOBUF_LIB_$(UNAME)) CARTESI_EXECUTABLE_LDFLAGS=$(CARTESI_EXECUTABLE_LDFLAGS_$(UNAME)) -SERVER_MANAGER_LIBS:=$(CRYPTOPP_LIB) $(GRPC_LIB) $(BOOST_CORO_LIB) $(BOOST_LOG_LIB) -ldl +SERVER_MANAGER_LIBS:=$(CRYPTOPP_LIB) $(GRPC_LIB) $(BOOST_CORO_LIB) $(BOOST_LOG_LIB) $(BOOST_FILESYSTEM_LIB) -ldl TEST_SERVER_MANAGER_LIBS:=$(CRYPTOPP_LIB) $(GRPC_LIB) -ldl WARNS=-W -Wall -pedantic diff --git a/src/create-machines.lua b/src/create-machines.lua index 6e18efd..8f741f3 100755 --- a/src/create-machines.lua +++ b/src/create-machines.lua @@ -16,8 +16,8 @@ -- limitations under the License. -- -local cartesi = require"cartesi" -local util = require"cartesi.util" +local cartesi = require "cartesi" +local util = require "cartesi.util" local function stderr_unsilenceable(fmt, ...) io.stderr:write(string.format(fmt, ...)) @@ -79,10 +79,10 @@ local options = { end }, { ".*", function(all) if not all then return false end - local not_option = all:sub(1,1) ~= "-" + local not_option = all:sub(1, 1) ~= "-" if not_option or all == "--" then - cmdline_opts_finished = true - return true + cmdline_opts_finished = true + return true end error("unrecognized option " .. all) end } @@ -91,11 +91,11 @@ local options = { -- Process command line options for i, a in ipairs(arg) do if not cmdline_opts_finished then - for j, option in ipairs(options) do - if option[2](a:match(option[1])) then - break - end - end + for j, option in ipairs(options) do + if option[2](a:match(option[1])) then + break + end + end end end @@ -111,62 +111,63 @@ local function create_directory(path) end local function get_file_length(file_path) - local file = io.open(file_path, "rb") - local size = file:seek("end") - file:close() - return size + local file = io.open(file_path, "rb") + local size = file:seek("end") + file:close() + return size end function create_default_config(images_dir, command) return { - ram = { - length = 0x4000000, - image_filename = images_dir .. "linux.bin", - }, - rom = { - image_filename = images_dir .. "rom.bin", - bootargs = "console=hvc0 rootfstype=ext2 root=/dev/mtdblock0 rw quiet swiotlb=noforce splash=no mtdparts=flash.0:-(root) init=/opt/cartesi/bin/init " .. command, - }, - htif = { - console_getchar = false, -- default - yield_automatic = true, - yield_manual = true, - }, - flash_drive = { - { - start = 1<<55, - length = get_file_length(images_dir .. "rootfs.ext2"), - image_filename = images_dir .. "rootfs.ext2", - shared = false, -- default - }, - }, - rollup = { - rx_buffer = { - start = 0x60000000, - length = 0x200000, - shared = false, -- default + ram = { + length = 0x4000000, + image_filename = images_dir .. "linux.bin", }, - tx_buffer = { - start = 0x60200000, - length = 0x200000, - shared = false, -- default + dtb = { + bootargs = "quiet earlycon=sbi console=hvc0 rootfstype=ext2 root=/dev/pmem0 rw init=/usr/sbin/cartesi-init", + init = "USER=dapp\n", + entrypoint = command, }, - input_metadata = { - start = 0x60400000, - length = 0x1000, - shared = false, -- default + htif = { + console_getchar = false, -- default + yield_automatic = true, + yield_manual = true, }, - voucher_hashes = { - start = 0x60600000, - length = 0x200000, - shared = false, -- default + flash_drive = { + { + start = 1 << 55, + length = get_file_length(images_dir .. "rootfs.ext2"), + image_filename = images_dir .. "rootfs.ext2", + shared = false, -- default + }, }, - notice_hashes = { - start = 0x60800000, - length = 0x200000, - shared = false, -- default + rollup = { + rx_buffer = { + start = 0x60000000, + length = 0x200000, + shared = false, -- default + }, + tx_buffer = { + start = 0x60200000, + length = 0x200000, + shared = false, -- default + }, + input_metadata = { + start = 0x60400000, + length = 0x1000, + shared = false, -- default + }, + voucher_hashes = { + start = 0x60600000, + length = 0x200000, + shared = false, -- default + }, + notice_hashes = { + start = 0x60800000, + length = 0x200000, + shared = false, -- default + }, }, - }, } end @@ -187,12 +188,12 @@ local function store_machine(machine, config, store_dir) end local function create_machine(machine_name, command, config_func) - stderr("Creating machine: " .. machine_name .. " ...\n") - local config = create_default_config(IMAGES_DIR, command) - if config_func then config_func(config) end - local machine = cartesi.machine(config) - machine:run(math.maxinteger) - store_machine(machine, config, MACHINES_DIR .. "/" .. machine_name ) + stderr("Creating machine: " .. machine_name .. " ...\n") + local config = create_default_config(IMAGES_DIR, command) + if config_func then config_func(config) end + local machine = cartesi.machine(config) + machine:run(math.maxinteger) + store_machine(machine, config, MACHINES_DIR .. "/" .. machine_name) end @@ -201,57 +202,62 @@ create_directory(MACHINES_DIR) -- Basic cases if rollup_init then - create_machine("advance-state-machine", "-- rollup-init echo-dapp --vouchers=2 --notices=2 --reports=2 --verbose"); - create_machine("inspect-state-machine", "-- rollup-init echo-dapp --reports=2 --verbose"); - create_machine("one-notice-machine", "-- rollup-init echo-dapp --vouchers=0 --notices=1 --reports=0 --verbose"); - create_machine("one-report-machine", "-- rollup-init echo-dapp --vouchers=0 --notices=0 --reports=1 --verbose"); - create_machine("one-voucher-machine", "-- rollup-init echo-dapp --vouchers=1 --notices=0 --reports=0 --verbose"); - create_machine("advance-rejecting-machine", "-- rollup-init echo-dapp --reject=0 --verbose"); - create_machine("inspect-rejecting-machine", "-- rollup-init echo-dapp --reports=0 --reject-inspects --verbose"); + create_machine("advance-state-machine", "rollup-init echo-dapp --vouchers=2 --notices=2 --reports=2 --verbose"); + create_machine("inspect-state-machine", "rollup-init echo-dapp --reports=2 --verbose"); + create_machine("one-notice-machine", "rollup-init echo-dapp --vouchers=0 --notices=1 --reports=0 --verbose"); + create_machine("one-report-machine", "rollup-init echo-dapp --vouchers=0 --notices=0 --reports=1 --verbose"); + create_machine("one-voucher-machine", "rollup-init echo-dapp --vouchers=1 --notices=0 --reports=0 --verbose"); + create_machine("advance-rejecting-machine", "rollup-init echo-dapp --reject=0 --verbose"); + create_machine("inspect-rejecting-machine", "rollup-init echo-dapp --reports=0 --reject-inspects --verbose"); else - create_machine("advance-state-machine", "-- ioctl-echo-loop --vouchers=2 --notices=2 --reports=2 --verbose=1"); - create_machine("inspect-state-machine", "-- ioctl-echo-loop --reports=2 --verbose=1"); - create_machine("one-notice-machine", "-- ioctl-echo-loop --vouchers=0 --notices=1 --reports=0 --verbose=1"); - create_machine("one-report-machine", "-- ioctl-echo-loop --vouchers=0 --notices=0 --reports=1 --verbose=1"); - create_machine("one-voucher-machine", "-- ioctl-echo-loop --vouchers=1 --notices=0 --reports=0 --verbose=1"); - create_machine("advance-rejecting-machine", "-- ioctl-echo-loop --reject=0 --verbose=1"); - create_machine("inspect-rejecting-machine", "-- ioctl-echo-loop --reports=0 --reject-inspects --verbose=1"); + create_machine("advance-state-machine", "ioctl-echo-loop --vouchers=2 --notices=2 --reports=2 --verbose=1"); + create_machine("inspect-state-machine", "ioctl-echo-loop --reports=2 --verbose=1"); + create_machine("one-notice-machine", "ioctl-echo-loop --vouchers=0 --notices=1 --reports=0 --verbose=1"); + create_machine("one-report-machine", "ioctl-echo-loop --vouchers=0 --notices=0 --reports=1 --verbose=1"); + create_machine("one-voucher-machine", "ioctl-echo-loop --vouchers=1 --notices=0 --reports=0 --verbose=1"); + create_machine("advance-rejecting-machine", "ioctl-echo-loop --reject=0 --verbose=1"); + create_machine("inspect-rejecting-machine", "ioctl-echo-loop --reports=0 --reject-inspects --verbose=1"); end -- Some edge cases -create_machine("no-output-machine", "-- while true; do rollup accept; done"); -create_machine("infinite-loop-machine", "-- rollup accept; while true; do :; done"); -create_machine("halting-machine", "-- rollup accept"); -create_machine("init-exception-machine", "-- echo '{\"payload\":\"test payload\"}' | rollup exception"); -create_machine("exception-machine", "-- rollup accept; echo '{\"payload\":\"test payload\"}' | rollup exception"); +create_machine("no-output-machine", "while true; do rollup accept; done"); +create_machine("infinite-loop-machine", "rollup accept; while true; do :; done"); +create_machine("halting-machine", "rollup accept"); +create_machine("init-exception-machine", "echo '{\"payload\":\"test payload\"}' | rollup exception"); +create_machine("exception-machine", "rollup accept; echo '{\"payload\":\"test payload\"}' | rollup exception"); + + +create_machine("fatal-error-machine", [[ +echo 'curl -vv -H "Content-Type: application/json" -d "{\"status\":\"accept\"}" http://127.0.0.1:5004/finish ; exit 2' > /home/dapp/s.sh; +chmod +x /home/dapp/s.sh; +rollup-init bash /home/dapp/s.sh +]]); + +create_machine("http-server-error-machine", [[ +echo 'curl -vv -H "Content-Type: application/json" -d "{\"status\":\"accept\"}" http://127.0.0.1:5004/finish ; killall rollup-http-server; sleep 86400' > /home/dapp/s.sh; +chmod +x /home/dapp/s.sh; +rollup-init bash /home/dapp/s.sh +]]); -create_machine("fatal-error-machine", - "-- echo 'import requests; requests.post(\"http://127.0.0.1:5004/finish\", json={\"status\":\"accept\"}); exit(2);' > s.py; rollup-init python3 s.py"); -create_machine("http-server-error-machine", - "-- echo 'import requests; import os; requests.post(\"http://127.0.0.1:5004/finish\", json={\"status\":\"accept\"}); os.system(\"killall rollup-http-server\");' > s.py; rollup-init python3 s.py"); create_machine("voucher-on-inspect-machine", - "-- rollup accept; echo '{\"address\":\"fafafafafafafafafafafafafafafafafafafafa\",\"payload\":\"test payload\"}' | rollup voucher; rollup accept"); + "rollup accept; echo '{\"address\":\"fafafafafafafafafafafafafafafafafafafafa\",\"payload\":\"test payload\"}' | rollup voucher; rollup accept"); create_machine("notice-on-inspect-machine", - "-- rollup accept; echo '{\"payload\":\"test payload\"}' | rollup notice; rollup accept"); + "rollup accept; echo '{\"payload\":\"test payload\"}' | rollup notice; rollup accept"); -- Should not work with no rollup or misconfigured htif -create_machine("no-manual-yield-machine", "-- yield automatic rx-accepted 0", - function(config) config.htif.yield_manual = false end ); -create_machine("no-automatic-yield-machine", "-- rollup accept", - function(config) config.htif.yield_automatic= false end ); -create_machine("console-getchar-machine", "-- rollup accept", - function(config) config.htif.console_getchar = true end ); -create_machine("no-rollup-machine", "-- yield manual rx-accepted 0", - function(config) config.rollup = nil end ); +create_machine("console-getchar-machine", "rollup accept", + function(config) config.htif.console_getchar = true end); +create_machine("no-rollup-machine", "yield manual rx-accepted 0", + function(config) config.rollup = nil end); -- Should not work with shared buffers -create_machine("shared-rx-buffer-machine", "-- rollup accept", - function(config) config.rollup.rx_buffer.shared = true end ); -create_machine("shared-tx-buffer-machine", "-- rollup accept", - function(config) config.rollup.tx_buffer.shared = true end ); -create_machine("shared-input-metadata-machine", "-- rollup accept", - function(config) config.rollup.input_metadata.shared = true end ); -create_machine("shared-voucher-hashes-machine", "-- rollup accept", - function(config) config.rollup.voucher_hashes.shared = true end ); -create_machine("shared-notice-hashes-machine", "-- rollup accept", - function(config) config.rollup.notice_hashes.shared = true end ); +create_machine("shared-rx-buffer-machine", "rollup accept", + function(config) config.rollup.rx_buffer.shared = true end); +create_machine("shared-tx-buffer-machine", "rollup accept", + function(config) config.rollup.tx_buffer.shared = true end); +create_machine("shared-input-metadata-machine", "rollup accept", + function(config) config.rollup.input_metadata.shared = true end); +create_machine("shared-voucher-hashes-machine", "rollup accept", + function(config) config.rollup.voucher_hashes.shared = true end); +create_machine("shared-notice-hashes-machine", "rollup accept", + function(config) config.rollup.notice_hashes.shared = true end); diff --git a/src/htif-defines.h b/src/htif-defines.h new file mode 100644 index 0000000..cf12b2e --- /dev/null +++ b/src/htif-defines.h @@ -0,0 +1,55 @@ +// Copyright Cartesi and individual authors (see AUTHORS) +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef HTIF_DEFINES_H +#define HTIF_DEFINES_H + +#include + +/// \brief HTIF protocol shifts +enum HTIF_protocol_shift : uint64_t { HTIF_DEV_SHIFT = 56, HTIF_CMD_SHIFT = 48, HTIF_DATA_SHIFT = 0 }; + +/// \brief HTIF protocol masks +enum HTIF_protocol_mask : uint64_t { + HTIF_DEV_MASK = 0xFF00000000000000, + HTIF_CMD_MASK = 0x00FF000000000000, + HTIF_DATA_MASK = 0x0000FFFFFFFFFFFF +}; + +/// \brief HTIF device identifiers +enum HTIF_device : uint64_t { HTIF_DEVICE_HALT = 0, HTIF_DEVICE_CONSOLE = 1, HTIF_DEVICE_YIELD = 2 }; + +/// \brief HTIF device commands +enum HTIF_device_command : uint64_t { + HTIF_HALT_HALT = 0, + HTIF_CONSOLE_GETCHAR = 0, + HTIF_CONSOLE_PUTCHAR = 1, + HTIF_YIELD_AUTOMATIC = 0, + HTIF_YIELD_MANUAL = 1 +}; + +/// \brief HTIF yield reasons +enum HTIF_yield_reason : uint64_t { + HTIF_YIELD_REASON_PROGRESS = 0, + HTIF_YIELD_REASON_RX_ACCEPTED = 1, + HTIF_YIELD_REASON_RX_REJECTED = 2, + HTIF_YIELD_REASON_TX_VOUCHER = 3, + HTIF_YIELD_REASON_TX_NOTICE = 4, + HTIF_YIELD_REASON_TX_REPORT = 5, + HTIF_YIELD_REASON_TX_EXCEPTION = 6, +}; + +#endif /* end of include guard: HTIF_DEFINES_H */ diff --git a/src/server-manager.cpp b/src/server-manager.cpp index ae74c8b..912aad5 100644 --- a/src/server-manager.cpp +++ b/src/server-manager.cpp @@ -78,30 +78,18 @@ #pragma clang diagnostic pop #endif -#include - #include "complete-merkle-tree.h" +#include "htif-defines.h" #include "keccak-256-hasher.h" #include "merkle-tree-proof.h" #include "protobuf-util.h" -/// \brief HTIF yield reasons -enum HTIF_yield_reason : uint64_t { - HTIF_YIELD_REASON_PROGRESS = HTIF_YIELD_REASON_PROGRESS_DEF, - HTIF_YIELD_REASON_RX_ACCEPTED = HTIF_YIELD_REASON_RX_ACCEPTED_DEF, - HTIF_YIELD_REASON_RX_REJECTED = HTIF_YIELD_REASON_RX_REJECTED_DEF, - HTIF_YIELD_REASON_TX_VOUCHER = HTIF_YIELD_REASON_TX_VOUCHER_DEF, - HTIF_YIELD_REASON_TX_NOTICE = HTIF_YIELD_REASON_TX_NOTICE_DEF, - HTIF_YIELD_REASON_TX_REPORT = HTIF_YIELD_REASON_TX_REPORT_DEF, - HTIF_YIELD_REASON_TX_EXCEPTION = HTIF_YIELD_REASON_TX_EXCEPTION_DEF, -}; - constexpr const uint64_t ROLLUP_ADVANCE_STATE = 0; constexpr const uint64_t ROLLUP_INSPECT_STATE = 1; static constexpr uint32_t manager_version_major = 0; -static constexpr uint32_t manager_version_minor = 8; -static constexpr uint32_t manager_version_patch = 2; +static constexpr uint32_t manager_version_minor = 9; +static constexpr uint32_t manager_version_patch = 0; static constexpr const char *manager_version_pre_release = ""; static constexpr const char *manager_version_build = ""; @@ -1554,25 +1542,25 @@ void trigger_and_wait_checkin(handler_context &hctx, async_context &actx, T trig /// \param data New data field /// \return Register value with replaced data field static constexpr uint64_t htif_replace_data_field(uint64_t reg, uint64_t data) { - return (reg & (~HTIF_DATA_MASK_DEF)) | ((data << HTIF_DATA_SHIFT_DEF) & HTIF_DATA_MASK_DEF); + return (reg & (~HTIF_DATA_MASK)) | ((data << HTIF_DATA_SHIFT) & HTIF_DATA_MASK); } /// \brief Obtains the dev field in HTIF's fromhost/tohost register value /// \return Dev data field in register static constexpr uint64_t htif_dev_field(uint64_t reg) { - return (reg & HTIF_DEV_MASK_DEF) >> HTIF_DEV_SHIFT_DEF; + return (reg & HTIF_DEV_MASK) >> HTIF_DEV_SHIFT; } /// \brief Extracts the cmd field in HTIF's fromhost/tohost register value /// \return cmd data field in register static constexpr uint64_t htif_cmd_field(uint64_t reg) { - return (reg & HTIF_CMD_MASK_DEF) >> HTIF_CMD_SHIFT_DEF; + return (reg & HTIF_CMD_MASK) >> HTIF_CMD_SHIFT; } /// \brief Extracts the data field in HTIF's fromhost/tohost register value /// \return cmd data field in register static constexpr uint64_t htif_data_field(uint64_t reg) { - return (reg & HTIF_DATA_MASK_DEF) >> HTIF_DATA_SHIFT_DEF; + return (reg & HTIF_DATA_MASK) >> HTIF_DATA_SHIFT; } /// \brief Checks if HTIF's tohost/fromhost matches an yield device manual command @@ -1581,15 +1569,15 @@ static constexpr uint64_t htif_data_field(uint64_t reg) { /// \param value Register value static void check_htif_yield_manual(async_context &actx, const std::string ®name, uint64_t value) { auto dev = htif_dev_field(value); - if (dev != HTIF_DEVICE_YIELD_DEF) { + if (dev != HTIF_DEVICE_YIELD) { THROW((taint_session{actx.session, grpc::StatusCode::INTERNAL, - "invalid dev field in " + regname + " (expected " + std::to_string(HTIF_DEVICE_YIELD_DEF) + ", got " + + "invalid dev field in " + regname + " (expected " + std::to_string(HTIF_DEVICE_YIELD) + ", got " + std::to_string(dev) + ")"})); } auto cmd = htif_cmd_field(value); - if (cmd != HTIF_YIELD_MANUAL_DEF) { + if (cmd != HTIF_YIELD_MANUAL) { THROW((taint_session{actx.session, grpc::StatusCode::INTERNAL, - "invalid cmd field in " + regname + " (expected " + std::to_string(HTIF_YIELD_MANUAL_DEF) + ", got " + + "invalid cmd field in " + regname + " (expected " + std::to_string(HTIF_YIELD_MANUAL) + ", got " + std::to_string(cmd) + ")"})); } } @@ -1598,10 +1586,10 @@ static void check_htif_yield_manual(async_context &actx, const std::string ®n /// \param value Register value static void check_yield_reason_accepted(uint64_t value) { auto data = htif_data_field(value) << 16 >> 48; - if (data != HTIF_YIELD_REASON_RX_ACCEPTED_DEF) { + if (data != HTIF_YIELD_REASON_RX_ACCEPTED) { THROW((finish_error_yield_none{grpc::StatusCode::INVALID_ARGUMENT, - "invalid data field in htif.tohost (expected " + std::to_string(HTIF_YIELD_REASON_RX_ACCEPTED_DEF) + - ", got " + std::to_string(data) + ")"})); + "invalid data field in htif.tohost (expected " + std::to_string(HTIF_YIELD_REASON_RX_ACCEPTED) + ", got " + + std::to_string(data) + ")"})); } } @@ -3282,6 +3270,9 @@ where passed to the spawned remote cartesi machine default: localhost:0 + --version + prints the server version number + --help prints this message and exits @@ -3289,6 +3280,11 @@ where name); } +/// \brief Prints server_manager version +static void print_version() { + (void) fprintf(stderr, "%d.%d.%d\n", manager_version_major, manager_version_minor, manager_version_patch); +} + /// \brief Checks if string matches prefix and captures remaninder /// \param pre Prefix to match in str. /// \param str Input string @@ -3345,6 +3341,9 @@ int main(int argc, char *argv[]) try { ; } else if (stringval("--server-address=", argv[i], &server_address)) { ; + } else if (strcmp(argv[i], "--version") == 0) { + print_version(); + exit(0); } else if (strcmp(argv[i], "--help") == 0) { help(argv[0]); exit(0); diff --git a/src/test-server-manager.cpp b/src/test-server-manager.cpp index 63bced1..7a77a0b 100644 --- a/src/test-server-manager.cpp +++ b/src/test-server-manager.cpp @@ -565,12 +565,12 @@ void assert_bool(bool value, const std::string &msg, const std::string &file, in #define ASSERT_STATUS_CODE(s, f, v) assert_status_code(s, f, v, __FILE__, __LINE__) static void test_get_version(const std::function &test) { - test("The server-manager server version should be 0.8.x", [](ServerManagerClient &manager) { + test("The server-manager server version should be 0.9.x", [](ServerManagerClient &manager) { Versioning::GetVersionResponse response; Status status = manager.get_version(response); ASSERT_STATUS(status, "GetVersion", true); ASSERT((response.version().major() == 0), "Version Major should be 0"); - ASSERT((response.version().minor() == 8), "Version Minor should be 8"); + ASSERT((response.version().minor() == 9), "Version Minor should be 9"); }); } @@ -655,22 +655,6 @@ static void test_start_session(const std::function files = { - "hash", "config.protobuf", - "0000000000001000-f000.bin", // rom + "hash", "config.json", "0000000000020000-6000.bin", // shadow tlb + "0000000000600000-200000.bin", // uarch-ram "0000000060000000-200000.bin", // rollup rx buffer "0000000060200000-200000.bin", // rollup tx buffer "0000000060400000-1000.bin", // rollup input metadata "0000000060600000-200000.bin", // rollup voucher hashes "0000000060800000-200000.bin", // rollup notice hashes + "000000007ff00000-100000.bin", // dtb "0000000080000000-4000000.bin", // ram - "0080000000000000-4400000.bin" // root drive + "0080000000000000-5e67000.bin" // root drive }; if (machine_dir.empty()) { return false;