From 928a843b1655e2f6970f1718148349556b10a264 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ciro=20Santilli=20=E5=85=AD=E5=9B=9B=E4=BA=8B=E4=BB=B6=20?= =?UTF-8?q?=E6=B3=95=E8=BD=AE=E5=8A=9F?= Date: Sun, 5 May 2019 00:00:00 +0000 Subject: [PATCH] baremetal: arm allow using floating point instructions --- baremetal/arch/arm/dump_regs.c | 15 +++++++++++++++ build-baremetal | 14 ++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 baremetal/arch/arm/dump_regs.c diff --git a/baremetal/arch/arm/dump_regs.c b/baremetal/arch/arm/dump_regs.c new file mode 100644 index 0000000..5b60bd6 --- /dev/null +++ b/baremetal/arch/arm/dump_regs.c @@ -0,0 +1,15 @@ +/* I want to move el and all other "what's the initial value of such system register" into here. */ + +#include +#include + +int main(void) { + uint32_t cpsr; + uint32_t mvfr1; + __asm__ ("mrs %0, cpsr" : "=r" (cpsr) : :); + /* TODO this is blowing up an exception, how to I read from it? */ + /*__asm__ ("vmrs %0, mvfr1" : "=r" (mvfr1) : :);*/ + printf("cpsr %" PRIx32 "\n", cpsr); + /*printf("mvfr1 %" PRIx32 "\n", mvfr1);*/ + return 0; +} diff --git a/build-baremetal b/build-baremetal index 6af7c52..923c230 100755 --- a/build-baremetal +++ b/build-baremetal @@ -47,6 +47,20 @@ Build the baremetal examples with crosstool-NG. '-mcpu={}'.format(self.env['mcpu']), LF, '-nostartfiles', LF, ] + if self.env['arch'] == 'arm': + cflags.extend([ + '-mhard-float', LF, + # This uses the soft float ABI for calling functions from objets in Newlib which + # our crosstool-NG config compiles with soft floats, while emiting hard float + # from C and allowing us to use it from assembly, e.g. for the VMRS instruction: + # which would otherwise fail "with selected processor does not support XXX in ARM mode" + # Bibliography: + # - https://stackoverflow.com/questions/9753749/arm-compilation-error-vfp-registered-used-by-executable-not-object-file + # - https://stackoverflow.com/questions/41131432/cross-compiling-error-selected-processor-does-not-support-fmrx-r3-fpexc-in/41131782#41131782 + # - https://embeddedartistry.com/blog/2017/10/9/r1q7pksku2q3gww9rpqef0dnskphtc + '-mfloat-abi=softfp', LF, + '-mfpu=crypto-neon-fp-armv8', LF, + ]) cflags_after = ['-lm'] if self.env['emulator'] == 'gem5': if self.env['machine'] == 'VExpress_GEM5_V1':