Module Name: src
Committed By: simonb
Date: Tue Nov 15 14:33:34 UTC 2022
Modified Files:
src/sys/arch/riscv/include: sysreg.h
src/sys/arch/riscv/riscv: pmap_machdep.c riscv_machdep.c vm_machdep.c
Log Message:
Use similar macro-magic to aarch64 armreg.h to add per-csr
read/write/set-bits/clear-bits inline functions. Keep the
open-coded 32-bit version of riscvreg_cycle_read() than reads
a 64-bit cycle counter values.
Added benefit of fixing these so that the inline asm uses __volatile
and aren't opmtimised to nops by the compiler.
To generate a diff of this commit:
cvs rdiff -u -r1.24 -r1.25 src/sys/arch/riscv/include/sysreg.h
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/riscv/riscv/pmap_machdep.c
cvs rdiff -u -r1.23 -r1.24 src/sys/arch/riscv/riscv/riscv_machdep.c
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/riscv/riscv/vm_machdep.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/riscv/include/sysreg.h
diff -u src/sys/arch/riscv/include/sysreg.h:1.24 src/sys/arch/riscv/include/sysreg.h:1.25
--- src/sys/arch/riscv/include/sysreg.h:1.24 Sun Nov 13 08:13:55 2022
+++ src/sys/arch/riscv/include/sysreg.h Tue Nov 15 14:33:33 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: sysreg.h,v 1.24 2022/11/13 08:13:55 skrll Exp $ */
+/* $NetBSD: sysreg.h,v 1.25 2022/11/15 14:33:33 simonb Exp $ */
/*
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -104,7 +104,64 @@ riscvreg_fcsr_write_frm(uint32_t __new)
return __SHIFTOUT(__old, FCSR_FRM);
}
+
+#define RISCVREG_READ_INLINE(regname) \
+static inline uintptr_t \
+csr_##regname##_read(void) \
+{ \
+ uintptr_t __rv; \
+ asm volatile("csrr %0, " #regname : "=r"(__rv) :: "memory"); \
+ return __rv; \
+}
+
+#define RISCVREG_WRITE_INLINE(regname) \
+static inline void \
+csr_##regname##_write(uintptr_t __val) \
+{ \
+ asm volatile("csrw " #regname ", %0" :: "r"(__val) : "memory"); \
+}
+
+#define RISCVREG_SET_INLINE(regname) \
+static inline void \
+csr_##regname##_set(uintptr_t __mask) \
+{ \
+ if (__builtin_constant_p(__mask) && __mask < 0x20) { \
+ asm volatile("csrsi " #regname ", %0" :: "i"(__mask) : \
+ "memory"); \
+ } else { \
+ asm volatile("csrs " #regname ", %0" :: "r"(__mask) : \
+ "memory"); \
+ } \
+}
+
+#define RISCVREG_CLEAR_INLINE(regname) \
+static inline void \
+csr_##regname##_clear(uintptr_t __mask) \
+{ \
+ if (__builtin_constant_p(__mask) && __mask < 0x20) { \
+ asm volatile("csrci " #regname ", %0" :: "i"(__mask) : \
+ "memory"); \
+ } else { \
+ asm volatile("csrc " #regname ", %0" :: "r"(__mask) : \
+ "memory"); \
+ } \
+}
+
+#define RISCVREG_READ_WRITE_INLINE(regname) \
+RISCVREG_READ_INLINE(regname) \
+RISCVREG_WRITE_INLINE(regname)
+#define RISCVREG_SET_CLEAR_INLINE(regname) \
+RISCVREG_SET_INLINE(regname) \
+RISCVREG_CLEAR_INLINE(regname)
+#define RISCVREG_READ_SET_CLEAR_INLINE(regname) \
+RISCVREG_READ_INLINE(regname) \
+RISCVREG_SET_CLEAR_INLINE(regname)
+#define RISCVREG_READ_WRITE_SET_CLEAR_INLINE(regname) \
+RISCVREG_READ_WRITE_INLINE(regname) \
+RISCVREG_SET_CLEAR_INLINE(regname)
+
/* Supervisor Status Register */
+RISCVREG_READ_SET_CLEAR_INLINE(sstatus) // supervisor status register
#ifdef _LP64
#define SR_WPRI __BITS(62, 34) | __BITS(31,20) | __BIT(17) | \
__BITS(12,9) | __BITS(7,6) | __BITS(3,2)
@@ -144,6 +201,7 @@ riscvreg_fcsr_write_frm(uint32_t __new)
/* Supervisor interrupt registers */
/* ... interrupt pending register (sip) */
+RISCVREG_READ_SET_CLEAR_INLINE(sip) // supervisor interrupt pending
/* Bit (XLEN-1) - 10 is WIRI */
#define SIP_SEIP __BIT(9)
#define SIP_UEIP __BIT(8)
@@ -155,6 +213,7 @@ riscvreg_fcsr_write_frm(uint32_t __new)
#define SIP_USIP __BIT(0)
/* ... interrupt-enable register (sie) */
+RISCVREG_READ_SET_CLEAR_INLINE(sie) // supervisor interrupt enable
/* Bit (XLEN-1) - 10 is WIRI */
#define SIE_SEIE __BIT(9)
#define SIE_UEIE __BIT(8)
@@ -177,38 +236,6 @@ riscvreg_fcsr_write_frm(uint32_t __new)
#define SR_KERNEL (SR_SIE | SR_UIE)
#endif
-static inline uintptr_t
-riscvreg_status_read(void)
-{
- uintptr_t __sr;
- __asm("csrr\t%0, sstatus" : "=r"(__sr));
- return __sr;
-}
-
-static inline uintptr_t
-riscvreg_status_clear(uintptr_t __mask)
-{
- uintptr_t __sr;
- if (__builtin_constant_p(__mask) && __mask < 0x20) {
- __asm("csrrci\t%0, sstatus, %1" : "=r"(__sr) : "i"(__mask));
- } else {
- __asm("csrrc\t%0, sstatus, %1" : "=r"(__sr) : "r"(__mask));
- }
- return __sr;
-}
-
-static inline uintptr_t
-riscvreg_status_set(uintptr_t __mask)
-{
- uintptr_t __sr;
- if (__builtin_constant_p(__mask) && __mask < 0x20) {
- __asm("csrrsi\t%0, sstatus, %1" : "=r"(__sr) : "i"(__mask));
- } else {
- __asm("csrrs\t%0, sstatus, %1" : "=r"(__sr) : "r"(__mask));
- }
- return __sr;
-}
-
// Cause register
#define CAUSE_INTERRUPT_P(cause) ((cause) & __BIT(XLEN-1))
#define CAUSE_CODE(cause) ((cause) & __BITS(XLEN-2, 0))
@@ -241,14 +268,13 @@ riscvreg_status_set(uintptr_t __mask)
#define IRQ_SUPERVISOR_EXTERNAL 9
#define IRQ_MACHINE_EXTERNAL 11
+RISCVREG_READ_INLINE(time)
+#ifdef _LP64
+RISCVREG_READ_INLINE(cycle)
+#else /* !_LP64 */
static inline uint64_t
-riscvreg_cycle_read(void)
+csr_cycle_read(void)
{
-#ifdef _LP64
- uint64_t __lo;
- __asm __volatile("csrr\t%0, cycle" : "=r"(__lo));
- return __lo;
-#else
uint32_t __hi0, __hi1, __lo0;
do {
__asm __volatile(
@@ -260,8 +286,8 @@ riscvreg_cycle_read(void)
[__hi1] "=r"(__hi1));
} while (__hi0 != __hi1);
return ((uint64_t)__hi0 << 32) | (uint64_t)__lo0;
-#endif
}
+#endif /* !_LP64 */
#ifdef _LP64
#define SATP_MODE __BITS(63,60)
@@ -280,36 +306,25 @@ riscvreg_cycle_read(void)
#define SATP_PPN __BITS(21,0)
#endif
-static inline uintptr_t
-riscvreg_satp_read(void)
-{
- uintptr_t satp;
- __asm __volatile("csrr %0, satp" : "=r" (satp));
- return satp;
-}
-
-static inline void
-riscvreg_satp_write(uintptr_t satp)
-{
- __asm __volatile("csrw satp, %0" :: "r" (satp));
-}
+RISCVREG_READ_WRITE_INLINE(satp)
+/* Fake "ASID" CSR (a field of SATP register) functions */
static inline uint32_t
-riscvreg_asid_read(void)
+csr_asid_read(void)
{
- uintptr_t satp;
- __asm __volatile("csrr %0, satp" : "=r" (satp));
+ uintptr_t satp = csr_satp_read();
return __SHIFTOUT(satp, SATP_ASID);
}
static inline void
-riscvreg_asid_write(uint32_t asid)
+csr_asid_write(uint32_t asid)
{
uintptr_t satp;
- __asm __volatile("csrr %0, satp" : "=r" (satp));
+
+ satp = csr_satp_read();
satp &= ~SATP_ASID;
satp |= __SHIFTIN(asid, SATP_ASID);
- __asm __volatile("csrw satp, %0" :: "r" (satp));
+ csr_satp_write(satp);
}
#endif /* _RISCV_SYSREG_H_ */
Index: src/sys/arch/riscv/riscv/pmap_machdep.c
diff -u src/sys/arch/riscv/riscv/pmap_machdep.c:1.13 src/sys/arch/riscv/riscv/pmap_machdep.c:1.14
--- src/sys/arch/riscv/riscv/pmap_machdep.c:1.13 Sun Oct 16 08:43:44 2022
+++ src/sys/arch/riscv/riscv/pmap_machdep.c Tue Nov 15 14:33:33 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap_machdep.c,v 1.13 2022/10/16 08:43:44 skrll Exp $ */
+/* $NetBSD: pmap_machdep.c,v 1.14 2022/11/15 14:33:33 simonb Exp $ */
/*
* Copyright (c) 2014, 2019, 2021 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
#define __PMAP_PRIVATE
#include <sys/cdefs.h>
-__RCSID("$NetBSD: pmap_machdep.c,v 1.13 2022/10/16 08:43:44 skrll Exp $");
+__RCSID("$NetBSD: pmap_machdep.c,v 1.14 2022/11/15 14:33:33 simonb Exp $");
#include <sys/param.h>
#include <sys/buf.h>
@@ -168,14 +168,14 @@ pmap_md_xtab_activate(struct pmap *pmap,
__SHIFTIN(pai->pai_asid, SATP_ASID) |
__SHIFTIN(pmap->pm_md.md_ppn, SATP_PPN);
- riscvreg_satp_write(satp);
+ csr_satp_write(satp);
}
void
pmap_md_xtab_deactivate(struct pmap *pmap)
{
- riscvreg_satp_write(0);
+ csr_satp_write(0);
}
void
@@ -276,13 +276,13 @@ pmap_bootstrap(vaddr_t vstart, vaddr_t v
tlb_asid_t
tlb_get_asid(void)
{
- return riscvreg_asid_read();
+ return csr_asid_read();
}
void
tlb_set_asid(tlb_asid_t asid, struct pmap *pm)
{
- riscvreg_asid_write(asid);
+ csr_asid_write(asid);
}
#if 0
Index: src/sys/arch/riscv/riscv/riscv_machdep.c
diff -u src/sys/arch/riscv/riscv/riscv_machdep.c:1.23 src/sys/arch/riscv/riscv/riscv_machdep.c:1.24
--- src/sys/arch/riscv/riscv/riscv_machdep.c:1.23 Tue Oct 18 04:24:54 2022
+++ src/sys/arch/riscv/riscv/riscv_machdep.c Tue Nov 15 14:33:33 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: riscv_machdep.c,v 1.23 2022/10/18 04:24:54 skrll Exp $ */
+/* $NetBSD: riscv_machdep.c,v 1.24 2022/11/15 14:33:33 simonb Exp $ */
/*-
* Copyright (c) 2014, 2019, 2022 The NetBSD Foundation, Inc.
@@ -33,7 +33,7 @@
#include "opt_riscv_debug.h"
#include <sys/cdefs.h>
-__RCSID("$NetBSD: riscv_machdep.c,v 1.23 2022/10/18 04:24:54 skrll Exp $");
+__RCSID("$NetBSD: riscv_machdep.c,v 1.24 2022/11/15 14:33:33 simonb Exp $");
#include <sys/param.h>
@@ -122,9 +122,9 @@ delay(unsigned long us)
{
const uint32_t cycles_per_us = curcpu()->ci_data.cpu_cc_freq / 1000000;
const uint64_t cycles = (uint64_t)us * cycles_per_us;
- const uint64_t finish = riscvreg_cycle_read() + cycles;
+ const uint64_t finish = csr_cycle_read() + cycles;
- while (riscvreg_cycle_read() < finish) {
+ while (csr_cycle_read() < finish) {
/* spin, baby spin */
}
}
Index: src/sys/arch/riscv/riscv/vm_machdep.c
diff -u src/sys/arch/riscv/riscv/vm_machdep.c:1.5 src/sys/arch/riscv/riscv/vm_machdep.c:1.6
--- src/sys/arch/riscv/riscv/vm_machdep.c:1.5 Thu Sep 29 06:51:17 2022
+++ src/sys/arch/riscv/riscv/vm_machdep.c Tue Nov 15 14:33:33 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: vm_machdep.c,v 1.5 2022/09/29 06:51:17 skrll Exp $ */
+/* $NetBSD: vm_machdep.c,v 1.6 2022/11/15 14:33:33 simonb Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.5 2022/09/29 06:51:17 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.6 2022/11/15 14:33:33 simonb Exp $");
#define _PMAP_PRIVATE
@@ -111,7 +111,7 @@ cpu_lwp_fork(struct lwp *l1, struct lwp
*/
--tf; /* cpu_switchto uses trapframes */
- tf->tf_sr = riscvreg_status_read();
+ tf->tf_sr = csr_sstatus_read();
tf->tf_s0 = (intptr_t)func; /* S0 */
tf->tf_s1 = (intptr_t)arg; /* S1 */
tf->tf_ra = (intptr_t)cpu_lwp_trampoline; /* RA */