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).
I'm trying to debug some device tree problems while booting Linux and
figured it would be really nice to have access to the device tree while
trying to debug these problems. I think this might be useful for lots
of people, so I went ahead and cleaned up the code enough that it should
actaully work in most cases.
Some platforms can't boot Linux on all the harts. This commit allows
platforms to define the set of harts that should be prevented from
booting past BBL. This is essentially just a new mechanism for defining
the DISABLED_HART_MASK.