From 2848cf6a182c11c5177e8e19510dd215a369ccc4 Mon Sep 17 00:00:00 2001 From: "W. J. van der Laan" Date: Sun, 4 Apr 2021 07:15:42 +0000 Subject: [PATCH] lib: Make Linux scaffold work for RISC-V64. * lib/linux/riscv64-mes-gcc/exit-42.S, lib/linux/riscv64-mes-gcc/hello-mes.S, lib/linux/riscv64-mes/elf64-0exit-42.hex2, lib/linux/riscv64-mes/elf64-0header.hex2, lib/linux/riscv64-mes/elf64-0hello-mes.hex2, lib/linux/riscv64-mes/elf64-body-exit-42.hex2, lib/linux/riscv64-mes/elf64-body-hello-mes.hex2, lib/linux/riscv64-mes/elf64-footer-single-main.hex2, lib/linux/riscv64-mes/elf64-header.hex2: New files. Makes basic scaffold pass on RISC-V64. --- lib/linux/riscv64-mes-gcc/exit-42.S | 31 +++ lib/linux/riscv64-mes-gcc/hello-mes.S | 45 ++++ lib/linux/riscv64-mes/elf64-0exit-42.hex2 | 34 +++ lib/linux/riscv64-mes/elf64-0header.hex2 | 84 ++++++ lib/linux/riscv64-mes/elf64-0hello-mes.hex2 | 59 +++++ lib/linux/riscv64-mes/elf64-body-exit-42.hex2 | 53 ++++ .../riscv64-mes/elf64-body-hello-mes.hex2 | 70 +++++ .../riscv64-mes/elf64-footer-single-main.hex2 | 62 +++++ lib/linux/riscv64-mes/elf64-header.hex2 | 241 ++++++++++++++++++ src/mes.c | 2 +- 10 files changed, 680 insertions(+), 1 deletion(-) create mode 100644 lib/linux/riscv64-mes-gcc/exit-42.S create mode 100644 lib/linux/riscv64-mes-gcc/hello-mes.S create mode 100644 lib/linux/riscv64-mes/elf64-0exit-42.hex2 create mode 100644 lib/linux/riscv64-mes/elf64-0header.hex2 create mode 100644 lib/linux/riscv64-mes/elf64-0hello-mes.hex2 create mode 100644 lib/linux/riscv64-mes/elf64-body-exit-42.hex2 create mode 100644 lib/linux/riscv64-mes/elf64-body-hello-mes.hex2 create mode 100644 lib/linux/riscv64-mes/elf64-footer-single-main.hex2 create mode 100644 lib/linux/riscv64-mes/elf64-header.hex2 diff --git a/lib/linux/riscv64-mes-gcc/exit-42.S b/lib/linux/riscv64-mes-gcc/exit-42.S new file mode 100644 index 00000000..13098ac6 --- /dev/null +++ b/lib/linux/riscv64-mes-gcc/exit-42.S @@ -0,0 +1,31 @@ +/* + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2021 W. J. van der Laan + * + * This file is part of GNU Mes. + * + * GNU Mes 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. + * + * GNU Mes 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 GNU Mes. If not, see . + */ + +/** Code: */ + +SYS_exit = 93 /* Linux syscalls. */ + .globl _start /* Magic linker symbol: --entry-address. */ + + .text /* Program text. */ +_start: + li a7, SYS_exit /* System call function: exit, in a7. */ + li a0, 42 /* 1st parameter: exit status, in a0. */ + ecall /* Call system. */ + wfi /* Should not be reached. */ diff --git a/lib/linux/riscv64-mes-gcc/hello-mes.S b/lib/linux/riscv64-mes-gcc/hello-mes.S new file mode 100644 index 00000000..118faf18 --- /dev/null +++ b/lib/linux/riscv64-mes-gcc/hello-mes.S @@ -0,0 +1,45 @@ +/* + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2021 W. J. van der Laan + * + * This file is part of GNU Mes. + * + * GNU Mes 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. + * + * GNU Mes 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 GNU Mes. If not, see . + */ + +/** Code: */ + +SYS_exit = 93 /* Linux syscalls. */ +SYS_write = 64 +stdout = 1 /* File descriptor */ + .globl _start /* Magic linker symbol: --entry-address. */ + + .text /* Program text. */ +hello: .ascii "Hello, GNU Mes!\n" +bye: +.equ string_size, (bye - hello) + +_start: + li a7, SYS_write /* System call function: write, in a7. */ + li a0, stdout /* 1st parameter: file descriptor, in a0. */ +.equ string_offset, (hello - .) + auipc a1, 0 /* Load pc for pc-relative address */ + addi a1, a1, string_offset /* 2nd parameter: address, in a1. */ + li a2, string_size /* 3rd parameter: byte count a2. */ + ecall /* Call system. */ + + li a7, SYS_exit /* System call function: exit, in a7. */ + li a0, 0 /* 1st parameter: exit status, in a0. */ + ecall /* Call system. */ + wfi /* Should not be reached. */ diff --git a/lib/linux/riscv64-mes/elf64-0exit-42.hex2 b/lib/linux/riscv64-mes/elf64-0exit-42.hex2 new file mode 100644 index 00000000..79dd21a6 --- /dev/null +++ b/lib/linux/riscv64-mes/elf64-0exit-42.hex2 @@ -0,0 +1,34 @@ +### GNU Mes --- Maxwell Equations of Software +### Copyright © 2021 W. J. van der Laan +### +### This file is part of GNU Mes. +### +### GNU Mes 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. +### +### GNU Mes 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 GNU Mes. If not, see . + +### Commentary: + +# elf64-exit-42.hex2: `exit 42' for riscv64-linux written in hex2 +# assembly, for usage with elf64-0header.hex2. This produces a 160-byte +# binary (a0 hex). Inspiration was taken from GNU Gcc output of +# exit-42.S. + +### Code: + +# @80 +:ELF_text +93 08 d0 05 # li a7,93 +13 05 a0 02 # li a0,42 +73 00 00 00 # ecall +73 00 50 10 # wfi +:ELF_end diff --git a/lib/linux/riscv64-mes/elf64-0header.hex2 b/lib/linux/riscv64-mes/elf64-0header.hex2 new file mode 100644 index 00000000..f1afe421 --- /dev/null +++ b/lib/linux/riscv64-mes/elf64-0header.hex2 @@ -0,0 +1,84 @@ +### Copyright (C) 2016 Jeremiah Orians +### Copyright (C) 2017,2019 Jan (janneke) Nieuwenhuizen +### Copyright © 2021 W. J. van der Laan +### +### This file is part of GNU Mes. +### +### GNU Mes 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. +### +### GNU Mes 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 GNU Mes. If not, see . + +### Commentary: + +# elf64-0header.hex2: Simplest 64 bit elf header in hex2. Only a text +# segment, no data segment, no symbol tables. + +# stage0's hex2 format for riscv64 +# !