## Copyright (C) 2021 Andrius Štikonas ## Copyright (C) 2023 Janneke Nieuwenhuizen ## Copyright © 2023 Andrius Štikonas ## ## This file is part of stage0. ## ## stage0 is free software: you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation, either version 3 of the License, or ## (at your option) any later version. ## ## stage0 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. ## ## You should have received a copy of the GNU General Public License ## along with stage0. If not, see . :_start rd_fp rs1_sp mv ; Protect stack pointer ; Prepare argv rd_a0 rs1_fp !8 addi ; ARGV_address = FP + 8 rd_sp rs1_sp !-8 addi rs1_sp rs2_a0 sd ; Put argv on the stack ; Prepare envp rd_a0 rs1_fp mv ; Address we need to load from rd_a0 rs1_a0 ld ; Get ARGC rd_a0 rs1_a0 !2 addi ; OFFSET = ARGC + 2 rd_a0 rs1_a0 rs2_x3 slli ; OFFSET = OFFSET * WORDSIZE rd_a0 rs1_fp rs2_a0 add ; ENVP_address = RSP + OFFSET rd_sp rs1_sp !-8 addi rs1_sp rs2_a0 sd ; Put envp on the stack ; Stack offset rd_fp rs1_fp !8 addi ; Init libc rd_ra $FUNCTION___init_io jal ; Call main function rd_ra $FUNCTION_main jal ; Put return value on the stack so that _exit gets it rd_sp rs1_sp !-16 addi rs1_sp rs2_a0 sd ; Exit to kernel rd_a0 rs1_sp ld rd_a7 !93 addi ; Syscall for exit ecall ; Exit with code in a0