1/*
2 * Copyright 2005-2019, Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 * 		Axel D��rfler <axeld@pinc-software.de>
7 * 		Ingo Weinhold <bonefish@cs.tu-berlin.de>
8 */
9#ifndef _KERNEL_ARCH_RISCV64_INT_H
10#define _KERNEL_ARCH_RISCV64_INT_H
11
12#include <SupportDefs.h>
13#include <arch_cpu_defs.h>
14
15#define NUM_IO_VECTORS	4096
16
17
18#ifdef __cplusplus
19
20static inline void
21arch_int_enable_interrupts_inline(void)
22{
23	SetBitsSstatus(SstatusReg{.ie = 1 << modeS}.val);
24}
25
26
27static inline int
28arch_int_disable_interrupts_inline(void)
29{
30	SstatusReg oldStatus{.val = GetAndClearBitsSstatus(SstatusReg{.ie = 1 << modeS}.val)};
31	return ((1 << modeS) & oldStatus.ie) != 0;
32}
33
34
35static inline void
36arch_int_restore_interrupts_inline(int oldState)
37{
38	if (oldState)
39		arch_int_enable_interrupts_inline();
40}
41
42
43static inline bool
44arch_int_are_interrupts_enabled_inline(void)
45{
46	SstatusReg status{.val = Sstatus()};
47	return ((1 << modeS) & status.ie) != 0;
48}
49
50
51// map the functions to the inline versions
52#define arch_int_enable_interrupts()	arch_int_enable_interrupts_inline()
53#define arch_int_disable_interrupts()	arch_int_disable_interrupts_inline()
54#define arch_int_restore_interrupts(status)	\
55	arch_int_restore_interrupts_inline(status)
56#define arch_int_are_interrupts_enabled()	\
57	arch_int_are_interrupts_enabled_inline()
58
59
60enum {
61	kMSyscallSwitchToSmode = 0,
62	kMSyscallSetTimer      = 1,
63};
64
65extern "C" status_t MSyscall(uint64 op, ...);
66
67#endif
68
69
70#endif /* _KERNEL_ARCH_RISCV64_INT_H */
71