Use of asm aliased register variables in local scope can only be used
for extended assembly parameters. This changes the few instances of
this in the floating point emulation to use the GNU extended assembly
syntax to access the `tp` register. This ensures that we do not rely on
undefined behaviour. This was uncovered when building the Proxy kernel
with clang and LLVM.
The use of `asm` for register aliasing is supported in two different
contexts:
- local variables (including GNU expression statements) where it may
only be used for specifying registers for input and output operands to
extended `asm` syntax.
c.f. https://gcc.gnu.org/onlinedocs/gcc/Local-Register-Variables.html#Local-Register-Variables
- global variables where it may be used to observe the contents of a
register.
c.f. https://gcc.gnu.org/onlinedocs/gcc/Global-Register-Variables.html#Global-Register-Variables
The two options here is to either to hoist the variable out into a
global variable, but then it should not be in a header due to fears of
ODR in case the optimizer does not inline it away, and thus becomes a
bit more tricky. The alternative that this change actually adopts is to
explicitly use a move to copy the value out via the GNU extended
assembly syntax.
With this change, it is now possible to build the Proxy Kernel
completely with clang/LLVM and link with LLD. The generated kernel also
runs under SPIKE and behaves as expected in a simple smoke test (without
any executable prints the expected message, and runs a trivial RVV
example).
This is an equivalent rewrite of the existing code. When building with
gas, the `bltu` would implicitly get relaxed to the `bgeu` + `j`. This
relaxation is required as the `init_other_hart` is not guaranteed to be
addressable in 12-bits. When building with the LLVM IAS instead of gas
we fail to link as the branch is not relaxed. This change enables LLVM
to build and link this code with the LLVM IAS and lld.
The LLVM IAS does not support the older name for the `mtval` CSR. This
updates the name to the current spelling, which is required to build
with the LLVM IAS. This remains compatible with binutils as well.
This replaces use of the old `sbadaddr` CSR name with the current
`stval` name. The old spelling is not supported by the LLVM IAS,
however, the modern spelling is supported by both LLVM and binutils.
Using recent compilers we get the following error message:
../pk/pk.c: In function 'run_loaded_program.constprop':
../pk/pk.c:177:3: error: both arguments to '__builtin___clear_cache'
must be pointers
177 | __clear_cache(0, 0);
| ^~~~~~~~~~~~~~~~~~~
Let's use the existing function __riscv_flush_icache(),
give it a header with a prototype and use it to
emits the FENCE.I instruction directly.
See #239
Suggested-by: Andrew Waterman <andrew@sifive.com>
Signed-off-by: Christoph Muellner <cmuellner@linux.com>
The upstream LiteX project defaults to "litex,liteuart" as the value
for the "compatible" property of the UART DT node, so let's add it to
the current list of accepted strings.
Signed-off-by: Gabriel Somlo <gsomlo@gmail.com>