kernel/arch/cpu: implement for riscv64

Change-Id: Ib4dd636f9ebb62931f77c809185ea810485d801e
Reviewed-on: https://review.haiku-os.org/c/haiku/+/4057
Reviewed-by: Alex von Gluck IV <[email protected]>
This commit is contained in:
X512
2021-08-06 15:41:33 +00:00
committed by Alex von Gluck IV
parent 62790afc9d
commit d031c09ceb
4 changed files with 76 additions and 9 deletions
@@ -12,24 +12,23 @@
static inline void
memory_read_barrier_inline(void)
{
asm volatile ("nop;" : : : "memory");
#warning RISCV64: check memory_read_barrier_inline (FNOP ?)
// TODO: investigate reparate read/write barriers
__sync_synchronize();
}
static inline void
memory_write_barrier_inline(void)
{
asm volatile ("nop;" : : : "memory");
#warning RISCV64: check memory_write_barrier_inline (FNOP ?)
// TODO: investigate reparate read/write barriers
__sync_synchronize();
}
static inline void
memory_full_barrier_inline(void)
{
asm volatile ("nop;" : : : "memory");
#warning RISCV64: check memory_full_barrier_inline (FNOP ?)
__sync_synchronize();
}
+31 -3
View File
@@ -8,6 +8,7 @@
#include <arch/riscv64/arch_thread_types.h>
#include <arch_cpu_defs.h>
#include <kernel.h>
@@ -15,8 +16,32 @@
#define CACHE_LINE_SIZE 64
#define set_ac()
#define clear_ac()
static inline bool
get_ac()
{
SstatusReg status(Sstatus());
return status.sum != 0;
}
static inline void
set_ac()
{
// TODO: Could be done atomically via CSRRS?
SstatusReg status(Sstatus());
status.sum = 1;
SetSstatus(status.val);
}
static inline void
clear_ac()
{
// TODO: Could be done atomically with CSRRC?
SstatusReg status(Sstatus());
status.sum = 0;
SetSstatus(status.val);
}
typedef struct arch_cpu_info {
@@ -29,6 +54,9 @@ extern "C" {
#endif
void __riscv64_setup_system_time(uint64 conversionFactor);
static inline void
arch_cpu_pause(void)
{
@@ -39,7 +67,7 @@ arch_cpu_pause(void)
static inline void
arch_cpu_idle(void)
{
// TODO: CPU idle call
Wfi();
}
@@ -8,9 +8,24 @@
#include <boot/menu.h>
#ifdef __riscv
struct CpuInfo {
uint32 id;
};
void arch_smp_register_cpu(CpuInfo** cpu);
#endif
int arch_smp_get_current_cpu(void);
void arch_smp_init_other_cpus(void);
#ifdef __riscv
void arch_smp_boot_other_cpus(uint64 satp, uint64 kernel_entry);
#else
void arch_smp_boot_other_cpus(uint32 pml4, uint64 kernel_entry);
#endif
void arch_smp_add_safemode_menus(Menu *menu);
void arch_smp_init(void);