haiku/headers/private/kernel/arch/riscv64/arch_cpu.h
X512 8ca0f03d0c riscv64/smp: Implement multi-processor support
* Working under qemu smp 1,2+
* Working on SiFive Unmatched
* x86_64 efi not broken by smp_boot_other_cpus change

Change-Id: I32ebc17913e46ed082be9ade8f56448bbf12f16e
Reviewed-on: https://review.haiku-os.org/c/haiku/+/4705
Tested-by: Commit checker robot <no-reply+buildbot@haiku-os.org>
Reviewed-by: Alex von Gluck IV <kallisti5@unixzen.com>
2021-12-12 15:35:24 +00:00

80 lines
1.1 KiB
C

/*
* Copyright 2003-2004, Axel Dörfler, axeld@pinc-software.de.
* Copyright 2019, Adrien Destugues, pulkomandy@pulkomandy.tk.
* Distributed under the terms of the MIT License.
*/
#ifndef _KERNEL_ARCH_RISCV64_CPU_H
#define _KERNEL_ARCH_RISCV64_CPU_H
#include <arch/riscv64/arch_thread_types.h>
#include <arch_cpu_defs.h>
#include <kernel.h>
#define CPU_MAX_CACHE_LEVEL 8
#define CACHE_LINE_SIZE 64
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 {
uint64 hartId;
} arch_cpu_info;
#ifdef __cplusplus
extern "C" {
#endif
void __riscv64_setup_system_time(uint64 conversionFactor);
static inline void
arch_cpu_pause(void)
{
// TODO: CPU pause
}
static inline void
arch_cpu_idle(void)
{
Wfi();
}
#ifdef __cplusplus
}
#endif
#endif /* _KERNEL_ARCH_RISCV64_CPU_H */