Skip to content

Commit 7e5ce63

Browse files
no1wudixiaoxiang781216
authored andcommitted
risc-v: Move CSR register manipulation macros to csr.h
1 parent 92a26ea commit 7e5ce63

File tree

2 files changed

+85
-61
lines changed

2 files changed

+85
-61
lines changed

arch/risc-v/include/csr.h

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -734,6 +734,91 @@
734734
#define ISELECT_EIE62 0xfe
735735
#define ISELECT_EIE63 0xff
736736

737+
#ifndef __ASSEMBLY__
738+
739+
/* Read the value of a CSR register */
740+
741+
#define READ_CSR(reg) \
742+
({ \
743+
uintreg_t __regval; \
744+
__asm__ __volatile__("csrr %0, " __STR(reg) : "=r"(__regval)); \
745+
__regval; \
746+
})
747+
748+
/* Read the value of a CSR register and set the specified bits */
749+
750+
#define READ_AND_SET_CSR(reg, bits) \
751+
({ \
752+
uintreg_t __regval; \
753+
__asm__ __volatile__("csrrs %0, " __STR(reg) ", %1": "=r"(__regval) : "rK"(bits)); \
754+
__regval; \
755+
})
756+
757+
/* Write a value to a CSR register */
758+
759+
#define WRITE_CSR(reg, val) \
760+
({ \
761+
__asm__ __volatile__("csrw " __STR(reg) ", %0" :: "rK"(val)); \
762+
})
763+
764+
/* Set the specified bits in a CSR register */
765+
766+
#define SET_CSR(reg, bits) \
767+
({ \
768+
__asm__ __volatile__("csrs " __STR(reg) ", %0" :: "rK"(bits)); \
769+
})
770+
771+
/* Clear the specified bits in a CSR register */
772+
773+
#define CLEAR_CSR(reg, bits) \
774+
({ \
775+
__asm__ __volatile__("csrc " __STR(reg) ", %0" :: "rK"(bits)); \
776+
})
777+
778+
/* Swap the value of a CSR register with the specified value */
779+
780+
#define SWAP_CSR(reg, val) \
781+
({ \
782+
uintptr_t regval; \
783+
__asm__ __volatile__("csrrw %0, " __STR(reg) ", %1" : "=r"(regval) \
784+
: "rK"(val)); \
785+
regval; \
786+
})
787+
788+
/* Write a value to an indirect CSR register */
789+
790+
#define WRITE_INDIRECT_CSR_REG0(reg, val) \
791+
({ \
792+
WRITE_CSR(CSR_ISELECT, reg); \
793+
WRITE_CSR(CSR_IREG, val); \
794+
})
795+
796+
/* Read the value of an indirect CSR register */
797+
798+
#define READ_INDIRECT_CSR_REG0(reg, val) \
799+
({ \
800+
WRITE_CSR(CSR_ISELECT, reg); \
801+
READ_CSR(CSR_IREG, val); \
802+
})
803+
804+
/* Set the specified bits in an indirect CSR register */
805+
806+
#define SET_INDIRECT_CSR_REG0(reg, val) \
807+
({ \
808+
WRITE_CSR(CSR_ISELECT, reg); \
809+
SET_CSR(CSR_IREG, val); \
810+
})
811+
812+
/* Clear the specified bits in an indirect CSR register */
813+
814+
#define CLEAR_INDIRECT_CSR_REG0(reg, val) \
815+
({ \
816+
WRITE_CSR(CSR_ISELECT, reg); \
817+
CLEAR_CSR(CSR_IREG, val); \
818+
})
819+
820+
#endif /* __ASSEMBLY__ */
821+
737822
/****************************************************************************
738823
* Public Types
739824
****************************************************************************/

arch/risc-v/src/common/riscv_internal.h

Lines changed: 0 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -160,67 +160,6 @@ static inline void putreg64(uint64_t v, const volatile uintreg_t a)
160160
__asm__ __volatile__("sd %0, 0(%1)" : : "r" (v), "r" (a));
161161
}
162162

163-
#define READ_CSR(reg) \
164-
({ \
165-
uintreg_t __regval; \
166-
__asm__ __volatile__("csrr %0, " __STR(reg) : "=r"(__regval)); \
167-
__regval; \
168-
})
169-
170-
#define READ_AND_SET_CSR(reg, bits) \
171-
({ \
172-
uintreg_t __regval; \
173-
__asm__ __volatile__("csrrs %0, " __STR(reg) ", %1": "=r"(__regval) : "rK"(bits)); \
174-
__regval; \
175-
})
176-
177-
#define WRITE_CSR(reg, val) \
178-
({ \
179-
__asm__ __volatile__("csrw " __STR(reg) ", %0" :: "rK"(val)); \
180-
})
181-
182-
#define SET_CSR(reg, bits) \
183-
({ \
184-
__asm__ __volatile__("csrs " __STR(reg) ", %0" :: "rK"(bits)); \
185-
})
186-
187-
#define CLEAR_CSR(reg, bits) \
188-
({ \
189-
__asm__ __volatile__("csrc " __STR(reg) ", %0" :: "rK"(bits)); \
190-
})
191-
192-
#define SWAP_CSR(reg, val) \
193-
({ \
194-
uintptr_t regval; \
195-
__asm__ __volatile__("csrrw %0, " __STR(reg) ", %1" : "=r"(regval) \
196-
: "rK"(val)); \
197-
regval; \
198-
})
199-
200-
#define WRITE_INDIRECT_CSR_REG0(reg, val) \
201-
({ \
202-
WRITE_CSR(CSR_ISELECT, reg); \
203-
WRITE_CSR(CSR_IREG, val); \
204-
})
205-
206-
#define READ_INDIRECT_CSR_REG0(reg, val) \
207-
({ \
208-
WRITE_CSR(CSR_ISELECT, reg); \
209-
READ_CSR(CSR_IREG, val); \
210-
})
211-
212-
#define SET_INDIRECT_CSR_REG0(reg, val) \
213-
({ \
214-
WRITE_CSR(CSR_ISELECT, reg); \
215-
SET_CSR(CSR_IREG, val); \
216-
})
217-
218-
#define CLEAR_INDIRECT_CSR_REG0(reg, val) \
219-
({ \
220-
WRITE_CSR(CSR_ISELECT, reg); \
221-
CLEAR_CSR(CSR_IREG, val); \
222-
})
223-
224163
#define riscv_append_pmp_region(a, b, s) \
225164
riscv_config_pmp_region(riscv_next_free_pmp_region(), a, b, s)
226165

0 commit comments

Comments
 (0)