diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2024-07-08 17:43:59 +0300 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2024-07-08 18:04:03 +0300 |
| commit | e134202611a50b358c147c92bfb8a7f443030b8b (patch) | |
| tree | ac7c31824adcf41a63e4d2c5e141f5149cc55b1a /arch/riscv64/kernel/arch.c | |
| parent | 7e828ec1e1479ff9a8afe845539d08ca0dfada5f (diff) | |
| download | kmi-e134202611a50b358c147c92bfb8a7f443030b8b.tar.gz kmi-e134202611a50b358c147c92bfb8a7f443030b8b.zip | |
fix LLVM
+ Anything extern is right out as LLVM doesn't produce correct code for
them. Maybe if I added some extra attributes but I'm skeptical.
Replaced with static variables and getters/setters.
+ Inline ASM is apparently a bit buggy, so use an assembly stub when jumping to init.
+ Minimize work done in main() to minimize chance of LLVM doing something silly.
Still not 100% certain that I shouldn't just write the main() as an assembly stub
in arch/riscv64 to be absolutely sure everything works as intended.
+ Make .kernel.start section SHF_ALLOC, otherwise lld complains about
pc-relative addressing
Probably some other stuff as well that I'm forgetting right now. But at least with
LLVM14 LTO seems to work, which is pretty cool?
Diffstat (limited to 'arch/riscv64/kernel/arch.c')
| -rw-r--r-- | arch/riscv64/kernel/arch.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/arch/riscv64/kernel/arch.c b/arch/riscv64/kernel/arch.c index 4561d8b..5dc50cf 100644 --- a/arch/riscv64/kernel/arch.c +++ b/arch/riscv64/kernel/arch.c @@ -13,7 +13,18 @@ #include "csr.h" #include "arch.h" -id_t __cpuid_to_hartid[MAX_CPUS]; +/** Array where indexing is done with CPU IDs, giving the corresponding hart ID. */ +static id_t __cpuid_to_hartid[MAX_CPUS]; + +id_t cpuid_to_hartid(id_t cpu) +{ + return __cpuid_to_hartid[cpu]; +} + +void set_hartid(id_t cpu, id_t hartid) +{ + __cpuid_to_hartid[cpu] = hartid; +} id_t hartid_to_cpuid(id_t hart) { |
