# Copyright 2024 RISC Zero, Inc.
#
# 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.
# riscv32-unknown-elf-gcc -nostdlib loop.s -o loop.bin
# riscv32-unknown-elf-strip loop.bin
.section .text
.global _start
_start:
# Load loop iteration count word from stdin via `read` syscall
#
# NOTE: We don't check for errors since we assume the host will provide
# correct input
li t0, 2 # `ecall::SOFTWARE`
la a0, count # Set syscall buffer pointer
li a1, 1 # Set syscall buffer length in words
la a2, sys_read # Set syscall name C string
li a3, 0 # Set read file to `STDIN_FILENO`
li a4, 4 # Set read length to 1 word
ecall # `ecall(t0, a0, a1, a2, a3, a4)`
# Prepare loop.
li a4, 0 # Initialize `iter` word
lw a5, count # Load `count` word from `read` result
loop:
addi a4, a4, 1 # iter += 1
bltu a4, a5, loop # if (iter < count) goto loop
# Halt syscall to terminate.
li t0, 0 # `ecall::HALT`
li a0, 0 # `halt::TERMINATE` with 0 exit code
la a1, digest # Set output digest
ecall # `ecall(t0, a0, a1)`
.section .data
# Memory location for the `read` syscall to write the loop iteration count.
count:
.align 4
.word 0
.section .rodata
# SHA2-256 hash of the null journal & assumption
digest:
.align 4
.word 0x5c176f83, 0x53f3c062, 0x42651683, 0x340b8b7e, 0x19d2d1f6, 0xae4d7602, 0xb8c606b4, 0xb075b53d
# Null-terminated `read` syscall name
sys_read:
.align 4
.asciz "risc0_zkvm_platform::syscall::nr::SYS_READ"