From a51143d366eedfe5ab30bfdf5f1f491ce230f549 Mon Sep 17 00:00:00 2001 From: Vadim Kaushan Date: Sun, 23 Dec 2018 11:25:04 +0100 Subject: [PATCH] Implement asm functions --- .gitignore | 3 ++ asm.S | 55 +++++++++++++++++++++++++++++ asm.h | 37 +++++++++++++++++++ asm32.S | 5 +++ assemble.sh | 16 +++++++++ bin/riscv32imac-unknown-none-elf.a | Bin 0 -> 6186 bytes bin/riscv32imc-unknown-none-elf.a | Bin 0 -> 6186 bytes build.rs | 15 +++++++- check-blobs.sh | 21 +++++++++++ 9 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 asm.S create mode 100644 asm.h create mode 100644 asm32.S create mode 100755 assemble.sh create mode 100644 bin/riscv32imac-unknown-none-elf.a create mode 100644 bin/riscv32imc-unknown-none-elf.a create mode 100755 check-blobs.sh diff --git a/.gitignore b/.gitignore index 1e7caa9..e38997a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ Cargo.lock target/ +bin/*.after +bin/*.before +bin/*.o diff --git a/asm.S b/asm.S new file mode 100644 index 0000000..030dfd1 --- /dev/null +++ b/asm.S @@ -0,0 +1,55 @@ +#include "asm.h" + +.section .text.__ebreak +.global __ebreak +__ebreak: + ebreak + ret + +.section .text.__wfi +.global __wfi +__wfi: + wfi + ret + +.section .text.__sfence_vma_all +.global __sfence_vma_all +__sfence_vma_all: + sfence.vma + ret + +.section .text.__sfence_vma +.global __sfence_vma +__sfence_vma: + sfence.vma a0, a1 + ret + + +// M-mode registers +REG_READ(mcause, 0x342) +REG_READ(mcycle, 0xB00) +REG_READ(mepc, 0x341) +REG_READ(mie, 0x304) +REG_SET_CLEAR(mie, 0x304) +REG_READ(minstret, 0xB02) +REG_READ(mip, 0x344) +REG_READ(misa, 0x301) +REG_READ(mstatus, 0x300) +REG_SET_CLEAR(mstatus, 0x300) +REG_READ_WRITE(mtvec, 0x305) +REG_READ(mvendorid, 0xF11) + +// S-mode registers +REG_READ_WRITE(satp, 0x180) +REG_READ(scause, 0x142) +REG_READ_WRITE(sepc, 0x141) +REG_READ(sie, 0x104) +REG_SET_CLEAR(sie, 0x104) +REG_READ(sip, 0x144) +REG_READ_WRITE(sscratch, 0x140) +REG_READ(sstatus, 0x100) +REG_SET_CLEAR(sstatus, 0x100) +REG_READ(stval, 0x143) +REG_READ_WRITE(stvec, 0x105) + +REG_READ(time, 0xC01) diff --git a/asm.h b/asm.h new file mode 100644 index 0000000..3ec97f2 --- /dev/null +++ b/asm.h @@ -0,0 +1,37 @@ +#ifndef __ASM_H +#define __ASM_H + +#define REG_READ(name, offset) \ +.section .text.__read_ ## name; \ +.global __read_ ## name; \ +__read_ ## name: \ + csrrs a0, offset, x0; \ + ret + +#define REG_WRITE(name, offset) \ +.section .text.__write_ ## name; \ +.global __write_ ## name; \ +__write_ ## name: \ + csrrw x0, offset, a0; \ + ret + +#define REG_SET(name, offset) \ +.section .text.__set_ ## name; \ +.global __set_ ## name; \ +__set_ ## name: \ + csrrs x0, offset, a0; \ + ret + +#define REG_CLEAR(name, offset) \ +.section .text.__clear_ ## name; \ +.global __clear_ ## name; \ +__clear_ ## name: \ + csrrc x0, offset, a0; \ + ret + + +#define REG_READ_WRITE(name, offset) REG_READ(name, offset); REG_WRITE(name, offset) +#define REG_SET_CLEAR(name, offset) REG_SET(name, offset); REG_CLEAR(name, offset) + +#endif /* __ASM_H */ + diff --git a/asm32.S b/asm32.S new file mode 100644 index 0000000..c163b64 --- /dev/null +++ b/asm32.S @@ -0,0 +1,5 @@ +#include "asm.h" + +REG_READ(mcycleh, 0xB80) +REG_READ(minstreth, 0xB82) +REG_READ(timeh, 0xC81) diff --git a/assemble.sh b/assemble.sh new file mode 100755 index 0000000..30e6fd2 --- /dev/null +++ b/assemble.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +set -euxo pipefail + +crate=riscv + +# remove existing blobs because otherwise this will append object files to the old blobs +rm -f bin/*.a + +riscv64-unknown-elf-gcc -c -mabi=ilp32 -march=rv32imac asm.S -o bin/$crate.o +riscv64-unknown-elf-gcc -c -mabi=ilp32 -march=rv32imac asm32.S -o bin/$crate-32.o +ar crs bin/riscv32imac-unknown-none-elf.a bin/$crate.o bin/$crate-32.o +cp bin/riscv32imac-unknown-none-elf.a bin/riscv32imc-unknown-none-elf.a + +rm bin/$crate.o +rm bin/$crate-32.o diff --git a/bin/riscv32imac-unknown-none-elf.a b/bin/riscv32imac-unknown-none-elf.a new file mode 100644 index 0000000000000000000000000000000000000000..2346b0c7c353b2d5da3e59c875ce2f09ccd08a42 GIT binary patch literal 6186 zcmeI0O=w(I6vt08ou)~@Ui00rbkcU(SmPKqrcq0YVpJrHY+AYyr!SK!8JbDsyw{`^ z#1Q=0bRp_OH=-ggltNup6h%Z_1gfqSR7AV6xDe4QC@#cv?$_LNoJ&Lyiuhpeod0>h zd+)pN-g)zXxBpOFE6p5kyD`U)Ay4YqFLSw(+lCEsybS;b0GfZl_CB3o0_ab%Se~kt z*{Q2wyw(aC3mJm>7<+%t13b) zu9;XjRGCZCS~;y(n6HOP?BXPi)6SgWMvV$~>pYN0$geX3TO zwhbq7N*!v{2t_7rgoz%L!Mp(`Zh$({7o=m|PQ?uWDA{LqRY8P+R(_|}_7 z^pZc`_UQP;JxxtbxbXGS1V2Mv0epzR3DU#r^Z*RP_0as(@=^km5tYzRu+!1~v%2QRq!VZx%WddW+EQLU#z=DRh_6-9q;W z-7EA~p|=UWUFaP`?-aUE=v_kRgzgu5x6pfp-Yaxo=zT)(7kYrLxCqyiKjRUuCx3<_ zSPT9YM$iHUuf+(~!6Bww;eMvu;3(7UA!d35oMd_L)7#(x)7#-7(>vfUrgy>w(|vG^ z>0MA_ItK~U{qPvmyWtt8_rOa`?}ay*&cl05?}JNB?}sm#MsxGOefaO&2Phqo{2i44oIaS8#^|+=GI^=Ukh$7!2Ke)G{9wX0%;EI7$5dx4Bfo-2yQ9B4GQjw05>MMa{=zC z;K-BNYsJuAUqx`w1-M59N1m=xd(R5)l>qmu;9d)GZwu~1fcsc*Zw9z;1V`(v(KxOO z?t=iA!3PMUu8kEh#?am84#9mA;PQg|G{B7r4!4TjHDKuaoem1}aNh^G zbAr1X;9eHoZvpP2;Qk13D}q~tlhbH^zY<(qfTOuZ)E)FLaTy=v2QYITe(0G_?_>0q zZvPW7gdg#>|68hT4jaQxM>a2*OEVJ^gFo|ubJk>p1a+PX*hPyj+xkUW2kM6q2q}6 kmOI>s`bGSZr^25?@b~l`p7ZxLY`^mN)Quh zd+)pN-g)zXxBpOFE6p5kyD`U)Ay4YqFLSw(+lCEsybS;b0GfZl_CB3o0_ab%Se~kt z*{Q2wyw(aC3mJm>7<+%t13b) zu9;XjRGCZCS~;y(n6HOP?BXPi)6SgWMvV$~>pYN0$geX3TO zwhbq7N*!v{2t_7rgoz%L!Mp(`Zh$({7o=m|PQ?uWDA{LqRY8P+R(_|}_7 z^pZc`_UQP;JxxtbxbXGS1V2Mv0epzR3DU#r^Z*RP_0as(@=^km5tYzRu+!1~v%2QRq!VZx%WddW+EQLU#z=DRh_6-9q;W z-7EA~p|=UWUFaP`?-aUE=v_kRgzgu5x6pfp-Yaxo=zT)(7kYrLxCqyiKjRUuCx3<_ zSPT9YM$iHUuf+(~!6Bww;eMvu;3(7UA!d35oMd_L)7#(x)7#-7(>vfUrgy>w(|vG^ z>0MA_ItK~U{qPvmyWtt8_rOa`?}ay*&cl05?}JNB?}sm#MsxGOefaO&2Phqo{2i44oIaS8#^|+=GI^=Ukh$7!2Ke)G{9wX0%;EI7$5dx4Bfo-2yQ9B4GQjw05>MMa{=zC z;K-BNYsJuAUqx`w1-M59N1m=xd(R5)l>qmu;9d)GZwu~1fcsc*Zw9z;1V`(v(KxOO z?t=iA!3PMUu8kEh#?am84#9mA;PQg|G{B7r4!4TjHDKuaoem1}aNh^G zbAr1X;9eHoZvpP2;Qk13D}q~tlhbH^zY<(qfTOuZ)E)FLaTy=v2QYITe(0G_?_>0q zZvPW7gdg#>|68hT4jaQxM>a2*OEVJ^gFo|ubJk>p1a+PX*hPyj+xkUW2kM6q2q}6 kmOI>s`bGSZr^25?@b~l`p7ZxLY`^mN)Qu bin/${filename%.a}.before +done + +./assemble.sh + +for lib in $(ls bin/*.a); do + filename=$(basename $lib) + riscv64-unknown-elf-objdump -Cd $lib > bin/${filename%.a}.after +done + +for cksum in $(ls bin/*.after); do + diff -u $cksum ${cksum%.after}.before +done