kernel/arch/int: implement for riscv64
Change-Id: I62d9bff75d35a685983c626720514ff17b1cef00 Reviewed-on: https://review.haiku-os.org/c/haiku/+/4052 Reviewed-by: Alex von Gluck IV <[email protected]>
This commit is contained in:
@@ -10,6 +10,7 @@
|
||||
#define _KERNEL_ARCH_RISCV64_INT_H
|
||||
|
||||
#include <SupportDefs.h>
|
||||
#include <arch_cpu_defs.h>
|
||||
|
||||
#define NUM_IO_VECTORS 256
|
||||
|
||||
@@ -17,30 +18,38 @@
|
||||
static inline void
|
||||
arch_int_enable_interrupts_inline(void)
|
||||
{
|
||||
// TODO: implement
|
||||
// TODO: Use atomic CSRRS?
|
||||
SstatusReg status(Sstatus());
|
||||
status.ie |= (1 << modeS);
|
||||
SetSstatus(status.val);
|
||||
}
|
||||
|
||||
|
||||
static inline int
|
||||
arch_int_disable_interrupts_inline(void)
|
||||
{
|
||||
// TODO: implement
|
||||
return 0;
|
||||
// TODO: Use atomic CSRRC?
|
||||
SstatusReg status(Sstatus());
|
||||
int oldState = ((1 << modeS) & status.ie) != 0;
|
||||
status.ie &= ~(1 << modeS);
|
||||
SetSstatus(status.val);
|
||||
return oldState;
|
||||
}
|
||||
|
||||
|
||||
static inline void
|
||||
arch_int_restore_interrupts_inline(int oldState)
|
||||
{
|
||||
// TODO: implement
|
||||
if (oldState)
|
||||
arch_int_enable_interrupts_inline();
|
||||
}
|
||||
|
||||
|
||||
static inline bool
|
||||
arch_int_are_interrupts_enabled_inline(void)
|
||||
{
|
||||
// TODO: implement
|
||||
return false;
|
||||
SstatusReg status(Sstatus());
|
||||
return ((1 << modeS) & status.ie) != 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -53,4 +62,12 @@ arch_int_are_interrupts_enabled_inline(void)
|
||||
arch_int_are_interrupts_enabled_inline()
|
||||
|
||||
|
||||
enum {
|
||||
kMSyscallSwitchToSmode = 0,
|
||||
kMSyscallSetTimer = 1,
|
||||
};
|
||||
|
||||
extern "C" status_t MSyscall(uint64 op, ...);
|
||||
|
||||
|
||||
#endif /* _KERNEL_ARCH_RISCV64_INT_H */
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
/*
|
||||
* Copyright 2021, Haiku, Inc.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _ARCH_TRAPS_H_
|
||||
#define _ARCH_TRAPS_H_
|
||||
|
||||
|
||||
# NOTE: this macro don't save SP, it should be saved manually
|
||||
.macro PushTrapFrame
|
||||
addi sp, sp, -256
|
||||
|
||||
sd ra, 0*8(sp)
|
||||
sd t6, 1*8(sp)
|
||||
# sd sp, 2*8(sp) # sp
|
||||
sd gp, 3*8(sp)
|
||||
sd tp, 4*8(sp)
|
||||
sd t0, 5*8(sp)
|
||||
sd t1, 6*8(sp)
|
||||
sd t2, 7*8(sp)
|
||||
sd t5, 8*8(sp)
|
||||
sd s1, 9*8(sp)
|
||||
sd a0, 10*8(sp)
|
||||
sd a1, 11*8(sp)
|
||||
sd a2, 12*8(sp)
|
||||
sd a3, 13*8(sp)
|
||||
sd a4, 14*8(sp)
|
||||
sd a5, 15*8(sp)
|
||||
sd a6, 16*8(sp)
|
||||
sd a7, 17*8(sp)
|
||||
sd s2, 18*8(sp)
|
||||
sd s3, 19*8(sp)
|
||||
sd s4, 20*8(sp)
|
||||
sd s5, 21*8(sp)
|
||||
sd s6, 22*8(sp)
|
||||
sd s7, 23*8(sp)
|
||||
sd s8, 24*8(sp)
|
||||
sd s9, 25*8(sp)
|
||||
sd s10, 26*8(sp)
|
||||
sd s11, 27*8(sp)
|
||||
sd t3, 28*8(sp)
|
||||
sd t4, 29*8(sp)
|
||||
sd fp, 30*8(sp)
|
||||
|
||||
addi fp, sp, 256
|
||||
.endm
|
||||
|
||||
|
||||
.macro PopTrapFrame
|
||||
ld ra, 0*8(sp)
|
||||
ld t6, 1*8(sp)
|
||||
# ld sp, 2*8(sp) restore later
|
||||
ld gp, 3*8(sp)
|
||||
# ld tp, 4*8(sp)
|
||||
ld t0, 5*8(sp)
|
||||
ld t1, 6*8(sp)
|
||||
ld t2, 7*8(sp)
|
||||
ld t5, 8*8(sp)
|
||||
ld s1, 9*8(sp)
|
||||
ld a0, 10*8(sp)
|
||||
ld a1, 11*8(sp)
|
||||
ld a2, 12*8(sp)
|
||||
ld a3, 13*8(sp)
|
||||
ld a4, 14*8(sp)
|
||||
ld a5, 15*8(sp)
|
||||
ld a6, 16*8(sp)
|
||||
ld a7, 17*8(sp)
|
||||
ld s2, 18*8(sp)
|
||||
ld s3, 19*8(sp)
|
||||
ld s4, 20*8(sp)
|
||||
ld s5, 21*8(sp)
|
||||
ld s6, 22*8(sp)
|
||||
ld s7, 23*8(sp)
|
||||
ld s8, 24*8(sp)
|
||||
ld s9, 25*8(sp)
|
||||
ld s10, 26*8(sp)
|
||||
ld s11, 27*8(sp)
|
||||
ld t3, 28*8(sp)
|
||||
ld t4, 29*8(sp)
|
||||
ld fp, 30*8(sp)
|
||||
|
||||
ld sp, 2*8(sp)
|
||||
.endm
|
||||
|
||||
|
||||
#endif // _ARCH_TRAPS_H_
|
||||
Reference in New Issue
Block a user